От курсора, чтобы выбрать .... с EXEC - PullRequest
1 голос
/ 23 февраля 2011

Это пример моего 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 ]

2 голосов
/ 23 февраля 2011

Боюсь, вы не можете напрямую запросить набор результатов хранимой процедуры. Предположительно, именно поэтому курсор находится там в первую очередь.

Использование курсоров обычно считается неэффективным, но вы можете заменить его на что-то вроде этого:

-- 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 голос
/ 23 февраля 2011

Привет, Вы не можете сделать это таким образом ..

Но то, что вы можете использовать, это функция и сделать выбор * из dbo.FunctionName (@Param)

Лично я бы не использовал Курсор.

Если возможно получить свой идентификатор, а затем использовать TempTable и выполнить свой запрос на основе списка переменных в таблице и расширения таблицы, чтобы соответствовать тем же критериям, что и ваш курсор, было бы лучше.

Но я могу видеть, где у вас могут быть ограничения с последующим комментарием.

Что означает 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)
...