Хранимая процедура возвращает несколько наборов результатов - PullRequest
11 голосов
/ 06 октября 2010

Мне нужен SP, чтобы вернуть несколько наборов результатов.Второй набор результатов будет основан на столбце первого набора результатов.

Итак:

declare @myTable1 table(field0 int,field1 varchar(255))
insert into @myTable1 select top 1 field0, field1 from table1

declare @myTable2 table(field0 int,field3 varchar(255))
insert into @myTable2 
select field0, field3 from table2 
where @myTable1.field0 = @myTable2.field0

Как вернуть @ myTable1 и @ myTable2 с моим SP?Является ли этот синтаксис вообще правильным?

Мои извинения, я все еще новичок в SQL ...

РЕДАКТИРОВАТЬ:

Итак,Я получаю сообщение об ошибке в последней строке кода ниже, которое гласит: «Должен объявить скалярную переменную« @ myTable1 »»

declare @myTable1 table(field0 int,field1 dateTime)
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m
where m.field4 > 6/29/2009

select * from @myTable1
select *
from someTable2 m2
where m2.field0 = @myTable1.field0

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

EDIT2: Решил эту проблему.Спасибо, ребята.

declare @myTable1 table(field0 int,field1 dateTime)
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m
where m.field4 > 6/29/2009

select * from @myTable1
select *
from someTable2 m2
where m2.field0 = (select field0 from @myTable1)

Ответы [ 2 ]

20 голосов
/ 06 октября 2010

Вы просто выбираете два набора результатов

SELECT * FROM @myTable1
SELECT * FROM @myTable2

Однако некоторые инструменты будут скрывать некоторые результаты (например, pgAdmin покажет только последний), а некоторые инструменты имеют какое-то требование для перехода к следующему набору результатов (например, IDataReader .NET не позволит вам Read() из второй набор результатов, пока вы не позвоните NextResult()).

Edit:

Альтернативой в этом случае, поскольку типы двух результатов совпадают, является объединение их в один набор результатов:

SELECT field0, field1 from @myTable1
UNION
SELECT field0, field3 from @myTable2

Вы также можете выбрать между UNION ALL или UNION DISTINCT (по умолчанию), когда последний будет отправлять только строки, которые не повторяются.

5 голосов
/ 06 октября 2010

В конце сохраненного процесса, поставьте:

SELECT * FROM @myTable1
SELECT * FROM @myTable2

Это вернет 2 набора результатов.

...