web-dev-qa-db-ja.com

一時テーブルのすべての行をループし、各行に対してストアドプロシージャを呼び出します

次のように、必要なすべての値を保持する一時テーブルを宣言しました。

    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' )

ここで、@ tempテーブル内の行をループする必要があり、各行に対して、@ tempテーブルのすべてのパラメーターを入力として受け取るspを呼び出します。どうすればこれを達成できますか?

26
merazuu

カーソルを使用できます:

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

このようなもの?

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

データセットをストアドプロシージャからC#またはVB.Netのデータテーブルに返してみてください。その後、一括コピーを使用して、データテーブル内の大量のデータを宛先テーブルにコピーできます。 BulkCopyを使用して、数千行の大きなデータテーブルをSqlテーブルにロードし、パフォーマンスの面で大きな成功を収めました。

C#またはVB.NetコードでBulkCopyを試してみることができます。

1
dgsjr

このようなことができます

    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