循环为存储过程
我有一个存储过程写入数据到表。循环为存储过程
我想要做的是使用一个变量在存储过程中
和变量是从一个单独的查询
采取例如分配项目编号: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://*.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