循环存储过程

时间:2014-11-21 10:45:38

标签: sql sql-server loops while-loop

我有一个将数据写入表的存储过程。

我想要做的是在存储过程中使用变量
以及要从单独的查询中分配项目编号的变量

例如:select ITEM_NUMBER from xTable 返回

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

我想要一个循环来分配从A1J9的每个变量并每次运行存储过程

这将多次运行存储过程以运行结果表中的所有项目。

谢谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,则FORWARD_ONLY是默认值,除非指定了关键字STATIC,KEYSET或DYNAMIC。 STATIC,KEYSET和DYNAMIC游标默认为SCROLL。与ODBC和ADO等数据库API不同,STATIC,KEYSET和DYNAMIC Transact-SQL游标支持FORWARD_ONLY。

答案 2 :(得分: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

答案 3 :(得分: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  
       
	   -- call your stored procedure here

       FETCH NEXT FROM db_cursor INTO @itemNumber  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor