2012-05-27 2 views
2

J'ai des problèmes avec un curseur qui se termine aléatoirement. Je veux produire une ligne pour chaque élément, donc pour chaque élément il y a une ligne pour chaque mois en 2012. S'il y a une ligne manquante pour un mois spécifique, cela devrait également être créé.Le curseur ne se termine jamais en T-SQL

Maintenant, elle produit une ligne pour le dernier élément de chaque mois jusqu'à l'année 2057.

Maintenant, j'ai une ligne pour chaque élément jusqu'à ce que tous les mois jusqu'à l'année 2057 et seulement pour un élément dans ma table.

Ma conception de table:

create table tblDataUpdateTest 
(
slno int identity(1,1), 
cName varchar(50), 
cRemarks varchar(50), 
[Date] date, 
) 

insert into tblDataUpdateTest (cName, cRemarks,[Date]) values ('name1','Text1','2012-01-01'), 
('name2','Text2','2012-01-01') 

Mon code:

declare @y as int 
declare @d as int 
SET @y = 2012 
SET @d = 1 
Declare @@counter int 
Declare @@month int 
set @@counter=0 
Declare @@slno int 
Declare @@cRemarks varchar(100) 
Declare @@cName varchar(50) 
Declare @@Date date 

set @@month = 1 
Declare tmepTbl cursor 
For 
Select slno,cName,cRemarks,date from tblDataUpdateTest 

Open tmepTbl /* Opening the cursor */ 

fetch next from tmepTbl 
into @@slno,@@cName,@@cRemarks,@@Date 

while @@fetch_Status=-1 
begin 

if not exists (select cRemarks from tblDataUpdateTest where MONTH(Date) = @@month AND YEAR(Date) = 2012) 
begin 
insert into tblDataUpdateTest (cName, cRemarks,[Date]) values (@@cName,'s',(DateAdd(yy, 2012-1900,DateAdd(m, @@month - 1, 01 - 1)))) 
end 

fetch next from tmepTbl 
into @@slno,@@cName,@@cRemarks,@@Date 

set @@[email protected]@month+1 
end 
close tmepTbl 
Deallocate tmepTbl 

Ma table maintenant

cName cRemarks Date 
name1 Text1 2012-01-01 
name2 Text2 2012-01-01 

Je veux follwing arrive:

cName cRemarks Date 
name1 Text1 2012-01-01 
name1 Text1 2012-02-01 
name1 Text1 2012-03-01 
name2 Text2 2012-01-01 
name2 Text2 2012-02-01 
name2 Text2 2012-03-01 

et ainsi de suite.

Merci!

Répondre

0

Ne serait-il pas préférable d'utiliser un CTE récursif, au lieu d'un curseur? Voici un exemple:

DECLARE @y INT 
DECLARE @m INT 
DECLARE @n INT 
SET @y = 2012 
SET @m = 1 
SET @n = 3 

;WITH dates(d, m) AS(
    SELECT CONVERT(DATE, CONVERT(VARCHAR(4), @y) + '-01-01'), 1 
    UNION ALL 
    SELECT CONVERT(DATE, CONVERT(VARCHAR(4), @y) + '-' + CASE WHEN m + 1 < 10 THEN '0' ELSE '' END + CONVERT(VARCHAR(2), m + 1) + '-01') 
     , m + 1 
    FROM dates 
    WHERE m < @n 
) 
INSERT INTO tblDataUpdateTest(cName, cRemarks,[Date]) 
    SELECT cName, cRemarks, [date] FROM (
    SELECT cName, cRemarks, dates.d AS [date] 
    FROM tblDataUpdateTest 
    CROSS JOIN dates) t 
    WHERE NOT(EXISTS(SELECT * FROM tblDataUpdateTest WHERE cName = t.cName AND [date] = t.[date])) 
OPTION(MAXRECURSION 11) 

SELECT * FROM tblDataUpdateTest ORDER BY cName 
+0

Thx! Je vais convertir mon curseur à cette – Knaks

Questions connexes