2014-03-24 21 views
22

我宣佈一個臨時表來保存所有需要的值如下:遍歷一個臨時表中的所有行和調用存儲過程的每一行

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。 我該如何做到這一點?

+0

您的proc是否爲@temp表中的每個值返回多個或單個行。如果proc只返回單行/值,我會condider重寫這個來調用函數。這樣,您可以在不使用'cursors' ='CURSES'或'LOOPS'的情況下執行表中的每個值。 SQL旨在執行基於集合的處理而不是循環。社區中的大多數人會避免使用'cursors'做的所有事情,它真的是一個'詛咒' – 2014-03-24 19:49:06

回答

63

你可以使用光標:

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 
+0

如何將密碼,IdTran,Kind從@temp傳入存儲過程? – merazuu

+0

看到編輯,添加密碼,你添加其他:) –

+0

真棒作品太棒了!我很好奇,如果有沒有辦法做到這一點,而不使用光標?如果沒有遊標,它會更有效率(這將會運行數十萬條記錄)? – merazuu

1

嘗試在C#或VB.Net從您的存儲過程中的數據集返回到您的數據表。然後,可以使用批量複製將數據表中的大量數據複製到目標表中。我已經使用BulkCopy將具有數千行的大型數據表加載到Sql表中,並在性能方面取得了巨大成功。

您可能想在您的C#或VB.Net代碼中試用BulkCopy。

1

這樣的事情?

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; 
0

你總是不需要爲此的遊標。你可以用一個while循環來做。儘可能避免使用遊標。 while循環比光標快。

+0

你在說什麼,夥計? –

+0

你在問我的朋友?你認爲你總是需要一個遊標? – Sam

+2

我不是說你的要求是不正確的。我說你給了一個不好的答案。你不會解釋任何事情或指出在哪裏可以找到更多信息。你的回答沒有任何幫助。 –

相關問題