这是我的SQL查询的一个例子:
Declare cursorA CURSOR FOR
SELECT idA FROM A WHERE ...
OPEN cursorA
Fetch Next From cursorA Into @my_id
While @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
INSERT #TEMP_TABLE
EXEC sp_MyStoredProcedure @my_id
end
Fetch Next From cursorA Into @my_id
end
Close cursorA
Deallocate cursorA
如何使用SELECT转换它,例如:
INSERT #TEMP_TABLE
EXEC sp_MyStoredProcedure idA
FROM A WHERE ...
答案 0 :(得分:2)
您无法直接查询存储过程的结果集。据推测,这就是光标首先存在的原因。
通常认为使用游标效率低下,但您可以用以下内容替换它:
-- get IDs
SELECT idA
INTO #tmpIds
FROM A
-- add row numbers and index for query speed (may not be needed if A is small)
ALTER TABLE #tmpIds ADD RowNum int IDENTITY(1,1)
CREATE CLUSTERED INDEX IDX_tmpIDs_RowNum ON #tmpIds(RowNum)
DECLARE @my_id int, @rowNum int, @rowCount int
SET @rowNum = 1
SELECT @rowCount = COUNT(*) FROM #tmpIds
-- iterate over #tmpIds
While @rowNum <= @rowCount
begin
SELECT @my_id = idA FROM #tmpIds WHERE RowNum = @RowNum
INSERT #TEMP_TABLE
EXEC sp_MyStoredProcedure @my_id
SET @rowNum = @rowNum + 1
end
答案 1 :(得分:1)
但你可以使用的是一个函数,并从dbo.FunctionName(@Param)执行Select *
我个人会避免使用光标。
如果可以获取您的ID,然后使用TempTable并根据表中的变量列表执行查询,并扩展表以满足与Cursor相同的标准。
但我可以看到你可能会对后来的评论有所限制。
StoredProcReturn是什么?
我会这样做:
CREATE TABLE @tmp
(
value int
)
INSERT INTO @tmp (value)
SELECT idA FROM A
INSERT INTO #tmpTable
SELECT value1, value2, value3
FROM dbo.function1(@tmp)