我有一個存儲過程寫入數據到表。循環爲存儲過程
我想要做的是使用一個變量在存儲過程中
和變量是從一個單獨的查詢
採取例如分配項目編號:select ITEM_NUMBER from xTable
回報
ITEM_NUMBER
------------
A1
B2
C4
D7
J9
我想要一個循環來分配這些變量,每個變量從A1
到J9
並且每次運行存儲過程
這將多次運行存儲過程以運行結果表中的所有項目。
感謝
我有一個存儲過程寫入數據到表。循環爲存儲過程
我想要做的是使用一個變量在存儲過程中
和變量是從一個單獨的查詢
採取例如分配項目編號:select ITEM_NUMBER from xTable
回報
ITEM_NUMBER
------------
A1
B2
C4
D7
J9
我想要一個循環來分配這些變量,每個變量從A1
到J9
並且每次運行存儲過程
這將多次運行存儲過程以運行結果表中的所有項目。
感謝
試試這個使用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
您錯過了「從TestCursor INTO @sItemNumber獲取下一步」之前的循環:) – hatem87 2014-11-21 11:12:58
我有更新它。謝謝.. – 2014-11-21 11:16:16
這聽起來像你最好的選擇是使用遊標。
遊標循環查詢,並從查詢結果的每一行設置一個變量。您可以在遊標正文中調用存儲過程,將已填充的變量作爲參數傳遞給過程。
的光標的語法如下:
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
Upvoted因爲光標是FAST_FORWARD – Jodrell 2014-11-21 11:21:09
嘗試像這樣使用
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
兩種方式
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遊標的支持。
使用CURSOR進行循環。 – 2014-11-21 11:01:53
你好,回答是在這裏:http://stackoverflow.com/questions/27058848/sql-while-to-read-a-table-data-to-a-variable/27059415#27059415 – Matej 2014-11-21 11:09:05
在一個簡單的級別,使用FAST_FORWARD遊標。但是等等,總的來說更好的方法是編寫另一個在整個集合上工作的存儲過程。 – Jodrell 2014-11-21 11:23:03