2

我有一个返回一组行的 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

我需要的是在运行游标和存储过程后提供了所有列,结果集应该是:

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

欢迎任何想法。谢谢。

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

4

2 回答 2

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
于 2010-12-30T16:45:11.553 回答
1

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

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

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

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

于 2010-12-30T15:42:42.367 回答