web-dev-qa-db-fra.com

Parcourez toutes les lignes d'une table temporaire et appelez une procédure stockée pour chaque ligne

J'ai déclaré une table temporaire pour contenir toutes les valeurs requises comme suit:

    DECLARE @temp TABLE
    (
    Password int,
    IdTran int,
    Kind varchar(16)
    )

INSERT INTO @temp
SELECT  s.Password, s.IdTran, 'test'
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'DEV' 
where s.[Type] = 'start' 
AND NOT EXISTS (SELECT * FROM signal s2
            WHERE s.Password = s2.Password 
            and s.IdTran = s2.IdTran 
            and s2.[Type] = 'progress' )

INSERT INTO @temp
SELECT  s.Password, s.IdTran, 'test'
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'PROD' 
where s.[Type] = 'progress' 
AND NOT EXISTS (SELECT * FROM signal s2
            WHERE s.Password = s2.Password 
            and s.IdTran = s2.IdTran 
            and s2.[Type] = 'finish' )

Maintenant, je dois parcourir les lignes de la table @temp et, et pour chaque ligne, appeler un sp qui prend en entrée tous les paramètres de la table @temp. Comment puis-je atteindre cet objectif?

26
merazuu

vous pouvez utiliser un curseur:

DECLARE @id int
DECLARE @pass varchar(100)

DECLARE cur CURSOR FOR SELECT Id, Password FROM @temp
OPEN cur

FETCH NEXT FROM cur INTO @id, @pass

WHILE @@FETCH_STATUS = 0 BEGIN
    EXEC mysp @id, @pass ... -- call your sp here
    FETCH NEXT FROM cur INTO @id, @pass
END

CLOSE cur    
DEALLOCATE cur
73
Zdravko Danev

quelque chose comme ça?

DECLARE maxval, val, @ind INT;
SELECT MAX(ID) as maxval FROM table;

while (ind <= maxval  ) DO           

      select `value` as val from `table` where `ID`=ind;

      CALL fn(val);

      SET ind = ind+1;
end while;
1
ejectamenta

Essayez de renvoyer le jeu de données de votre procédure stockée à votre fichier de données en C # ou VB.Net. Ensuite, la grande quantité de données dans votre datatable peut être copiée dans votre table de destination en utilisant une copie en bloc. J'ai utilisé BulkCopy pour charger des tables de données volumineuses contenant des milliers de lignes dans des tables SQL avec un grand succès en termes de performances.

Vous souhaiterez peut-être expérimenter BulkCopy dans votre code C # ou VB.Net.

1
dgsjr

Vous pouvez faire quelque chose comme ça

    Declare @min int=0, @max int =0 --Initialize variable here which will be use in loop 
    Declare @Recordid int,@TO nvarchar(30),@Subject nvarchar(250),@Body nvarchar(max)  --Initialize variable here which are useful for your

    select ROW_NUMBER() OVER(ORDER BY [Recordid] )  AS Rownumber, Recordid, [To], [Subject], [Body], [Flag]
            into #temp_Mail_Mstr FROM Mail_Mstr where Flag='1'  --select your condition with row number & get into a temp table

    set @min = (select MIN(RecordID) from #temp_Mail_Mstr); --Get minimum row number from temp table
    set @max = (select Max(RecordID) from #temp_Mail_Mstr);  --Get maximum row number from temp table

   while(@min <= @max)
   BEGIN
        select @Recordid=Recordid, @To=[To], @Subject=[Subject], @Body=Body from #temp_Mail_Mstr where Rownumber=@min

        -- You can use your variables (like @Recordid,@To,@Subject,@Body) here  
        -- Do your work here 

        set @min=@min+1 --Increment of current row number
    END
0
Durgesh Pandey