【问题标题】:Loop for stored procedure循环存储过程
【发布时间】:2015-01-19 11:43:37
【问题描述】:

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

我想要做的是在存储过程中使用一个变量
并且该变量将被分配从单独的查询中获取的项目编号

例如:select ITEM_NUMBER from xTable 返回

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

我想要一个循环将变量从A1 分配给J9 并每次运行存储过程

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

谢谢

【问题讨论】:

  • 使用 CURSOR 进行循环。
  • 你好,答案在这里:stackoverflow.com/questions/27058848/…
  • 简单来说,使用 FAST_FORWARD 游标。但是等等,总体而言更好的方法是编写另一个适用于整个集合的存储过程。

标签: sql sql-server loops while-loop


【解决方案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】:

    听起来你最好的选择是使用光标。

    游标遍历查询并从查询结果的每一行设置一个变量。您可以在游标主体中调用存储过程,将您填充的变量作为参数传递给该过程。

    游标的语法如下:

    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
    

    【讨论】:

      【解决方案3】:

      尝试这样使用

      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 

      【讨论】:

        【解决方案4】:

        使用 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
        

        【讨论】:

        • 您在循环结束之前错过了“FETCH NEXT FROM TestCursor INTO @sItemNumber”:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2013-11-13
        相关资源
        最近更新 更多