SQL Server游标包含Select中的值

时间:2010-12-30 15:24:57

标签: sql cursors

我有一个SELECT语句返回一组行。

从每一行开始,我需要获取一列的值并将其传递给存储过程以获取我需要为行集本身提供的值。

例如:

DECLARE @col1 int
DECLARE @col2 int
DECLARE @col3 varchar(20)

DECLARE myCursor CURSOR FOR
SELECT col1, col2, col3
FROM table1
WHERE....

OPEN myCursor
FETCH NEXT FROM myCursor
INTO @col1, @col2

WHILE @@FETH_STATUS = 0
BEGIN
  SET @col3 = EXEC proc_GetCol3_Value @col1, @col2

  FETCH NEXT FROM myCursor
  INTO @col1, @col2
END

CLOSE myCursor
DEALLOCATE myCursor

现在,基于此,我想返回由原始游标检索的行,以及从执行的存储过程中检索的值作为列3的值。

比如说,SQL游标返回的行是:

col1  col2  col3
  1   5000
  2   5000
  3   2500
  4   2000

我需要的是在运行游标后提供了所有列,并且Stored Proc和结果集应该是:

col1  col2  col3
  1   5000  APPROVED
  2   5000  REJECTED
  3   2500  CANCELLED
  4   2000  APPROVED

欢迎任何想法。感谢。

P.S。我知道很多人会建议简单地使用JOIN语句,但由于要执行的存储过程非常复杂,因此使用游标SQL语句进行连接会太复杂。

2 个答案:

答案 0 :(得分:3)

如果由于某种原因你无法改变功能:

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 
DECLARE @Output (col1 int, col2 int, col3 varchar (20))

DECLARE myCursor CURSOR FOR 
    SELECT col1, col2, col3 FROM table1 WHERE....  
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @col1, @col2  
WHILE @@FETH_STATUS = 0 
BEGIN   
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2

    INSERT INTO @Output (col1, col2, col3)
    VALUES @col1, @col2, @col3

FETCH NEXT FROM myCursor   INTO @col1, @col2 
END  
CLOSE myCursor 
DEALLOCATE myCursor 

SELECT col1, col2, col3 from @Output

答案 1 :(得分:1)

除非您被锁定使用proc_GetCol3_Value存储过程,否则我强烈建议您删除正在使用的光标,并将存储过程转换为用户定义的函数。

虽然我不喜欢用户定义的功能(由于性能问题),但这可能是一个使用它的情况。您很可能将存储过程代码迁移到用户定义的函数(我们将其称为func_GetCol3_Value)并返回状态,现在您的查询可以简单地为:

SELECT col1, col2, func_GetCol3_Value(col1, col2) as col3
FROM table1

根据存储过程的基本或复杂程度,您甚至可能不需要函数,但我们需要首先看一下代码。