2010-04-04 6 views
0

У меня есть хранимая процедураSQL Server Cursor данные как результат хранимой процедуры

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»?

+0

Это нормально для этого примера, но что, если список столбцов в инструкции выбора и вставки должен отличаться? –

+0

Нравится: DECLARE курсор FOR SELECT [FooData1], [FooData2] Из [FooTable]; OPEN cursor; FETCH NEXT FROM курсор INTO @ CurrFooData1, @ CurrFooData2; WHILE @@ FETCH_STATUS = 0 BEGIN SELECT @ CurrFooData1 AS FooData1, @ CurrFooData2 AS FooData2; INSERT INTO Bar (BarData) VALUES (@ CurrFooData1); FETCH NEXT FROM курсор INTO @CurrFooData; END; CLOSE курсор DEALLOCATE курсор –

+0

вопрос и ответ не имеют смысла: почему вы пытаетесь это сделать? – gbn

ответ

1

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

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

INSERT INTO Bar (BarData) 
    SELECT FooData1 FROM FooTable 

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

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

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

INSERT INTO Bar (BarData) 
    OUTPUT Inserted.* 
    SELECT FooData1 FROM FooTable 
+0

Мне нужно вернуть данные из хранимой процедуры (это делает SELECT @ CurrFooData1 AS FooData1, @ CurrFooData2 AS FooData2). Но «INSERT INTO .. ​​SELECT ..» не возвращает никаких данных. –

+0

@Dmitry: обновил мой ответ - используйте предложение 'OUTPUT', чтобы повторно выводить то, что вы только что вставили –

1

ли это, что вы хотите вывести данные, которые вы только что вставили? Если это так, и если вы используете версию 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 
Смежные вопросы