【问题标题】:run a stored procedure by fetching from a cursor row by row on SQL server 2008通过在 SQL Server 2008 上逐行从游标中获取来运行存储过程
【发布时间】:2014-05-23 21:54:29
【问题描述】:

我需要在 SQL Server 2008 上运行一个存储过程。

但是,我只能从游标中获取一行。之后,@@FETCH_STATUS 为 -1。

DECLARE @my_table TABLE
  (
     id int not null
  );

  INSERT INTO @my_table (id)
    SELECT DISTINCT a.id 
     FROM  table1 as a  
     WHERE a.value = 'abc' 
     ORDER BY a.id ASC    

  DECLARE t_input  CURSOR FOR 
    SELECT id 
    FROM  @my_table  

  DECLARE   @return_value  tinyint
  DECLARE @my_id  int

  OPEN  t_input  
  FETCH  NEXT  FROM  t_input  into @my_id  # only the first row is fetched successfully
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC    @return_value  =  my_procudure
              @arg1 = @my_id,               
              @ar2 = 9

        SELECT  'Return Value' = @return_value
       FETCH NEXT FROM t_input  into  @my_id  # this is -1 !!!!!!!!!!
  END

因此,它只在 while 循环中运行一次迭代。

my_procudure 运行良好,与光标无关。

在调试模式下,我看到循环只运行了一次。

任何帮助将不胜感激。

【问题讨论】:

  • 而@my_id 用于什么?你用常量值调用你的过程,对吧?还是 69 应该是参数?
  • @NickyvV,我改了,一个错字。谢谢!
  • @my_table 中有多少条记录?
  • 哦,在您的游标声明中,您正在选择 id,但@my_table 中没有名为“id”的列。
  • @Chris J. Breisch,我已经改变了它,但同样的错误!谢谢!

标签: sql sql-server sql-server-2008


【解决方案1】:

我认为您多次调用具有相同值的存储过程,并且只是假设它无效地退出游标。输入“选择'我跑';”在 my_procedure 中查看它实际运行了多少次。

【讨论】:

    【解决方案2】:

    根据代码,看起来光标将运行的次数等于

    SELECT COUNT(DISTINCT a.id)
    FROM  table1 as a  
    WHERE a.value = 'abc' 
    

    如果结果为 1,则为预期行为。您需要查看 table1 中的 a.value,以及您希望它如何影响此过程。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多