我有一个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语句进行连接会太复杂。
答案 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
根据存储过程的基本或复杂程度,您甚至可能不需要函数,但我们需要首先看一下代码。