从CURSOR到SELECT ....带有EXEC

时间:2011-02-23 10:56:45

标签: sql sql-server-2005 stored-procedures

这是我的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 ...

2 个答案:

答案 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)