Сохраненная процедура возвращает несколько наборов результатов
Мне нужен 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...
EDIT:
Итак, я получаю сообщение об ошибке в последней строке приведенного ниже кода: "Должен объявить скалярную переменную @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)
Ответы
Ответ 1
Вы в значительной степени просто выбираете два набора результатов
SELECT * FROM @myTable1
SELECT * FROM @myTable2
Однако некоторые инструменты скроют некоторые результаты (например, pgAdmin покажет только последний), а некоторые инструменты имеют какое-то требование для перехода к следующему набору результатов (например,.NET IDataReader не позволит вам Read()
из второй результат, пока вы не назовете NextResult()
).
Edit:
Альтернатива в этом случае, поскольку типы двух результатов совпадают, состоит в том, чтобы объединить их в один набор результатов:
SELECT field0, field1 from @myTable1
UNION
SELECT field0, field3 from @myTable2
Вы также можете выбрать между UNION ALL
или UNION DISTINCT
(по умолчанию), где последний будет отправлять только строки, которые не повторяются.
Ответ 2
В конце хранимой процедуры введите:
SELECT * FROM @myTable1
SELECT * FROM @myTable2
Это вернет 2 набора результатов.