2014-11-21 151 views
0

我有一個存儲過程寫入數據到表。循環爲存儲過程

我想要做的是使用一個變量在存儲過程中
和變量是從一個單獨的查詢

採取例如分配項目編號:select ITEM_NUMBER from xTable 回報

ITEM_NUMBER 
------------ 
    A1 
    B2 
    C4 
    D7 
    J9 

我想要一個循環來分配這些變量,每個變量從A1J9並且每次運行存儲過程

這將多次運行存儲過程以運行結果表中的所有項目。

感謝

+0

使用CURSOR進行循環。 – 2014-11-21 11:01:53

+0

你好,回答是在這裏:http://stackoverflow.com/questions/27058848/sql-while-to-read-a-table-data-to-a-variable/27059415#27059415 – Matej 2014-11-21 11:09:05

+0

在一個簡單的級別,使用FAST_FORWARD遊標。但是等等,總的來說更好的方法是編寫另一個在整個集合上工作的存儲過程。 – Jodrell 2014-11-21 11:23:03

回答

0

試試這個使用CURSOR

DECLARE @sItemNumber AS VARCHAR(MAX) 

DECLARE TestCursor CURSOR FOR 
(
    select ITEM_NUMBER from xTable 
) 

OPEN TestCursor 
FETCH NEXT FROM TestCursor INTO @sItemNumber 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC ProcedureName @sItemNumber 
    FETCH NEXT FROM TestCursor INTO @sItemNumber 
END 

CLOSE TestCursor 
DEALLOCATE TestCursor 
+0

您錯過了「從TestCursor INTO @sItemNumber獲取下一步」之前的循環:) – hatem87 2014-11-21 11:12:58

+0

我有更新它。謝謝.. – 2014-11-21 11:16:16

1

這聽起來像你最好的選擇是使用遊標。

遊標循環查詢,並從查詢結果的每一行設置一個變量。您可以在遊標正文中調用存儲過程,將已填充的變量作爲參數傳遞給過程。

的光標的語法如下:

DECLARE @item CHAR(2) 

DECLARE item_cursor CURSOR FAST_FORWARD READ_ONLY FOR 
SELECT ITEM_NUMBER from xTable 

OPEN item_cursor 

FETCH NEXT FROM item_cursor INTO @item 

WHILE @@FETCH_STATUS = 0 
BEGIN 

--Execute your stored procedure here, supplying @item as the parameter 

FETCH NEXT FROM item_cursor INTO @item 

END 

CLOSE item_cursor 

DEALLOCATE item_cursor 
+0

Upvoted因爲光標是FAST_FORWARD – Jodrell 2014-11-21 11:21:09

0

嘗試像這樣使用

DECLARE @itemNumber VARCHAR(50); 
 

 
DECLARE db_cursor CURSOR FOR 
 
SELECT ITEM_NUMBER FROM xTable; 
 

 
OPEN db_cursor 
 
FETCH NEXT FROM db_cursor INTO @itemNumber 
 

 

 
WHILE @@FETCH_STATUS = 0 
 
BEGIN 
 
     
 
\t -- call your stored procedure here 
 

 
     FETCH NEXT FROM db_cursor INTO @itemNumber 
 
END 
 

 
CLOSE db_cursor 
 
DEALLOCATE db_cursor

1

兩種方式

Select ITEM_NUMBER into #X from xTable 

DECLARE @PartVar varchar(10) 
WHILE(0 < (Select Count(*) from #X)) 
    BEGIN 
    SET ROWCOUNT 1 
    Select @PartVar = ITEM_NUMBER from #X 
    -- EXEC PROC @PartVar 
    SET ROWCOUNT 0 
    DELETE #X where ITEM_NUMBER = @PartVar 
    END 

DECLARE @PartVar varchar(10) 
DECLARE LOC CURSOR FORWARD_ONLY FOR SELECT ITEM_NUMBER from xTable 
OPEN LOC 
FETCH NEXT FROM LOC into @PartVar 

WHILE(@@FETCH_STATUS = 0) 
BEGIN 
    EXEC PROC @PartVar 
    FETCH NEXT FROM LOC into @PartVar 
END 

CLOSE LOC 
DEALLOCATE LOC 

http://msdn.microsoft.com/en-us/library/ms180169.aspx

FORWARD_ONLY 指定遊標只能從第一滾動到最後一行。 FETCH NEXT是唯一支持的提取選項。如果未指定STATIC,KEYSET或DYNAMIC關鍵字指定FORWARD_ONLY,則光標將作爲DYNAMIC遊標運行。如果未指定FORWARD_ONLY和SCROLL,則除非指定了關鍵字STATIC,KEYSET或DYNAMIC,否則FORWARD_ONLY是默認值。 STATIC,KEYSET和DYNAMIC遊標默認爲SCROLL。與數據庫API(如ODBC和ADO)不同,FORWARD_ONLY受STATIC,KEYSET和DYNAMIC Transact-SQL遊標的支持。