通过在SQL Server 2008上逐行从游标中提取来运行存储过程

时间:2014-05-23 21:54:29

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

我需要在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运行良好,与光标无关。

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我认为你多次使用相同的值调用存储过程,并假设它无效地退出游标。把“选择'我跑';”在my_procedure中查看它实际运行的次数。

答案 1 :(得分:0)

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

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

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