Aim:Copy
Raw table data to two actual tables with our logical conditions like
age calculations from Dateofbirth.
We
can do this with using CURSOR or without using CURSOR
Create
Raw Table as
CREATE
TABLE
MY_DUMP
(
ID
BIGINT
NOT
NULL
IDENTITY(1,1),
P_NO
VARCHAR(50),
NAME
VARCHAR(50),
DOB
DATE,
PRIMARY
KEY(ID)
);
SELECT
*
FROM
MY_DUMP;
Create
Actual Table One and Two as
CREATE
TABLE
MY_MAIN
(
ID
BIGINT
NOT
NULL
IDENTITY(1,1),
P_NO
VARCHAR(50),
NAME
VARCHAR(50),
AGE
INT,
MY_ID
VARCHAR(50),
MEM_COUNT
INT,
PRIMARY
KEY(ID)
);
SELECT
*
FROM
MY_MAIN;
CREATE
TABLE
MY_SUB
(
ID
BIGINT
NOT
NULL
IDENTITY(1,1),
MY_MAIN_ID
BIGINT
NOT
NULL,
NAME
VARCHAR(50),
AGE
INT,
MY_ID
VARCHAR(50),
SL_NO
TINYINT,
PRIMARY
KEY(ID),
FOREIGN
KEY(MY_MAIN_ID)
REFERENCES
MY_MAIN(ID)
);
SELECT
*
FROM
MY_SUB;
Insert
some raw data into raw table.
DECLARE
@N INT;
SET
@N=1;
WHILE(@N
<10)
BEGIN
INSERT
INTO
MY_DUMP(P_NO,NAME,DOB)
VALUES('POL'+CAST(@N
AS
VARCHAR(10)),'NAME'+CAST(@N
AS
VARCHAR(10)),DATEADD(year,
-(@N*8),
GETDATE()));
SET
@N=@N+1;
END;
UPDATE
MY_DUMP SET
P_NO='POL1'
WHERE
ID IN(1,2,3);
UPDATE
MY_DUMP SET
P_NO='POL2'
WHERE
ID IN(4,5,6);
UPDATE
MY_DUMP SET
P_NO='POL3'
WHERE
ID IN(7);
UPDATE
MY_DUMP SET
P_NO='POL4'
WHERE
ID IN(8,9);
/*WITH
CURSOR*/
WITH
CURSOR:Retrieving row by row from the current position in the result
set.
DECLARE
@P_NO VARCHAR(50)
DECLARE
MY_CUR CURSOR
LOCAL
FOR
SELECT
P_NO FROM
MY_DUMP GROUP
BY
P_NO;
OPEN
MY_CUR
FETCH
NEXT
FROM
MY_CUR INTO
@P_NO
WHILE
@@FETCH_STATUS
=
0
BEGIN
DECLARE
@ID VARCHAR(50);
DECLARE
MY_CUR_SUB CURSOR
LOCAL
FOR
SELECT
ID FROM
MY_DUMP WHERE
P_NO=@P_NO;
OPEN
MY_CUR_SUB
FETCH
NEXT
FROM
MY_CUR_SUB INTO
@ID
--INSERT
TO MAIN
DECLARE
@NAME VARCHAR(50);
DECLARE
@DOB DATE;
DECLARE
@MY_ID INT;
DECLARE
@MEM_COUNT INT;
DECLARE
@SL_NO INT;
SET
@SL_NO=1;
SELECT
@NAME=NAME,@DOB=DOB
FROM
MY_DUMP WHERE
ID=@ID;
SELECT
@MY_ID=ISNULL(MAX(ID),0)+1
FROM
MY_MAIN;
SELECT
@MEM_COUNT=COUNT(ID)
FROM
MY_DUMP WHERE
P_NO=@P_NO
INSERT
INTO
MY_MAIN(P_NO,NAME,AGE,MY_ID,MEM_COUNT)
SELECT
@P_NO,@NAME,DATEDIFF(year,@DOB,GETDATE()),'ABCD-'+CAST(@MY_ID
AS
VARCHAR(10)),@MEM_COUNT;
WHILE
@@FETCH_STATUS
=
0
BEGIN
--INSERT
TO SUB
SELECT
@NAME=NAME,@DOB=DOB
FROM
MY_DUMP WHERE
ID=@ID;
INSERT
INTO
MY_SUB(MY_MAIN_ID,NAME,AGE,MY_ID,SL_NO)
SELECT
@MY_ID,@NAME,DATEDIFF(year,@DOB,GETDATE()),'ABCD-'+CAST(@MY_ID
AS
VARCHAR(10))+'-'+CAST(@SL_NO
AS
VARCHAR(10)),@SL_NO;
SET
@SL_NO=@SL_NO+1;
FETCH
NEXT
FROM
MY_CUR_SUB INTO
@ID
END
CLOSE
MY_CUR_SUB
DEALLOCATE
MY_CUR_SUB
FETCH
NEXT
FROM
MY_CUR INTO
@P_NO
END
CLOSE
MY_CUR
DEALLOCATE
MY_CUR
/*WITH
OUT CURSOR 2005/2008*/
WITH
OUT CURSOR:Retrieving row by row using ROW_NUMBER
DECLARE
@P_NO VARCHAR(50);
DECLARE
@MY_CUR TABLE(P_NO
VARCHAR(50));
INSERT
INTO
@MY_CUR(P_NO)
SELECT
P_NO FROM
MY_DUMP GROUP
BY
P_NO;
DECLARE
@MY_CUR_ROW_COUNT INT;
SET
@MY_CUR_ROW_COUNT=1;
WHILE
(@MY_CUR_ROW_COUNT<=(SELECT
COUNT(P_NO)
FROM
@MY_CUR))
BEGIN
DECLARE
@MY_CUR_SUB TABLE(ID
INT);
SELECT
@P_NO=P_NO
FROM
(
SELECT
ROW_NUMBER()
OVER
(ORDER
BY
P_NO ASC)
AS
ROWNUMBER,
P_NO
FROM
@MY_CUR
)
AS
TEMP_TAB
WHERE
ROWNUMBER =
@MY_CUR_ROW_COUNT;
INSERT
INTO
@MY_CUR_SUB(ID)
SELECT
ID FROM
MY_DUMP WHERE
P_NO =@P_NO;
DECLARE
@MY_CUR_SUB_ROW_COUNT INT;
SET
@MY_CUR_SUB_ROW_COUNT=1;
--INSERT
TO MAIN
DECLARE
@NAME VARCHAR(50);
DECLARE
@DOB DATE;
DECLARE
@MY_ID INT;
DECLARE
@MEM_COUNT INT;
DECLARE
@SL_NO INT;
SET
@SL_NO=1;
DECLARE
@ID INT;
SELECT
@ID=ID
FROM
(
SELECT
ROW_NUMBER()
OVER
(ORDER
BY
ID ASC)
AS
ROWNUMBER,
ID
FROM
@MY_CUR_SUB
)
AS
TEMP_TAB_SUB
WHERE
ROWNUMBER =
1;
SELECT
@NAME=NAME,@DOB=DOB
FROM
MY_DUMP WHERE
ID =@ID;
SELECT
@MY_ID=ISNULL(MAX(ID),0)+1
FROM
MY_MAIN;
SELECT
@MEM_COUNT=COUNT(ID)
FROM
MY_DUMP WHERE
P_NO=@P_NO;
INSERT
INTO
MY_MAIN(P_NO,NAME,AGE,MY_ID,MEM_COUNT)
SELECT
@P_NO,@NAME,DATEDIFF(YEAR,@DOB,GETDATE()),'ABCD-'+CAST(@MY_ID
AS
VARCHAR(10)),@MEM_COUNT;
WHILE
(@MY_CUR_SUB_ROW_COUNT<=(SELECT
COUNT(ID)
FROM
@MY_CUR_SUB))
BEGIN
--INSERT
TO SUB
SELECT
@ID=ID
FROM
(
SELECT
ROW_NUMBER()
OVER
(ORDER
BY
ID ASC)
AS
ROWNUMBER,
ID
FROM
@MY_CUR_SUB
)
AS
TEMP_TAB_SUB
WHERE
ROWNUMBER =
@MY_CUR_SUB_ROW_COUNT;
SELECT
@NAME=NAME,@DOB=DOB
FROM
MY_DUMP WHERE
ID =@ID;
INSERT
INTO
MY_SUB(MY_MAIN_ID,NAME,AGE,MY_ID,SL_NO)
SELECT
@MY_ID,@NAME,DATEDIFF(YEAR,@DOB,GETDATE()),'ABCD-'+CAST(@MY_ID
AS
VARCHAR(10))+'-'+CAST(@SL_NO
AS
VARCHAR(10)),@SL_NO;
SET
@SL_NO=@SL_NO+1;
SET
@MY_CUR_SUB_ROW_COUNT=@MY_CUR_SUB_ROW_COUNT+1;
END
SET
@MY_CUR_ROW_COUNT=@MY_CUR_ROW_COUNT+1;
DELETE
FROM
@MY_CUR_SUB;
END
You Can Download the Working Code From here.