Данные SQL Server Cursor как результат хранимой процедуры - PullRequest
0 голосов
/ 04 апреля 2010

У меня есть хранимая процедура

DECLARE cursor FOR SELECT [FooData] From [FooTable];
OPEN cursor ;  
FETCH NEXT FROM cursor INTO @CurrFooData;
WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @CurrFooData AS FooData;
  INSERT INTO Bar (BarData) VALUES(@CurrFooData);
  FETCH NEXT FROM cursor INTO @CurrFooData;
END;
CLOSE cursor 
DEALLOCATE cursor 

Но в результате у меня много таблиц, а не одна. Как вернуть одну таблицу со столбцом «FooData» и всеми строками «@CurrFooData»?

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Вы хотите выводить данные, которые вы только что вставили? Если это так, и если вы используете версию SQL Server до для SQL Server 2005, то вы можете вставить нужные значения во временную таблицу следующим образом:

Create Table #FooTemp ( FooData ... )

Insert #FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From #FooTemp

Select FooData
From #FooTemp

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

Если вы используете SQL Server 2000+, вы можете сделать то же самое, что и выше, только в табличной переменной:

Declare @FooTemp Table ( FooData ... )

Insert @FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From @FooTemp

Select FooData
From @FooTemp

Если вы используете SQL Server 2005+, вы можете использовать предложение OUTPUT следующим образом:

Insert Bar( BarData )
 OUTPUT inserted.BarData
Select FooData
From FooTable
1 голос
/ 04 апреля 2010

Дмитрий, я думаю, вы должны действительно попытаться избавиться от этого курсора все вместе. Во втором примере вы выбираете два поля FooData1 и FooData2, но, в конце концов, вы только когда-либо вставляете значения ....

Вы можете легко переписать этот второй запрос - что-то вроде:

INSERT INTO Bar (BarData) 
    SELECT FooData1 FROM FooTable

Это все, что весь ваш курсор и все на самом деле делает.

Старайтесь избегать курсоров любой ценой - 99% времени, они не нужны - начните думать в SETS данных - не придерживайтесь процедурных циклов и курсора в SQL - это просто не очень хорошее совпадение!

Если вам нужно вывести то, что вы только что вставили, используйте предложение OUTPUT:

INSERT INTO Bar (BarData) 
    OUTPUT Inserted.* 
    SELECT FooData1 FROM FooTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...