Хранимая процедура возвращает несколько наборов результатов

Мне нужен 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)
 JNK06 окт. 2010 г., 22:16
Это не сработает, если у вас нет DECLARE @ Mytable1 в одном выражении. Если вы просто выделите последнюю часть, DECLARE не будет в этом запросе. эти переменные хороши только для одного запроса и не сохраняются.
 EJC06 окт. 2010 г., 22:17
Microsoft SQL Server 2005
 JNK06 окт. 2010 г., 22:07
Должен был спросить раньше, но какую СУБД вы используете?

Ответы на вопрос(2)

Решение Вопроса

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

SELECT * FROM @myTable1
SELECT * FROM @myTable2

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

Редактировать:

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

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

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

 EJC06 окт. 2010 г., 22:24
Здорово. Спасибо за предложения и полезный код. Мне нужно посмотреть в код, который вызывает процедуру, чтобы увидеть, что она делает с результатами.
 Jon Hanna06 окт. 2010 г., 21:39
@JNK, лол, это точно та же самая причина, по которой ясделал упомянув об этом, задаваясь вопросом, почему у них возникли проблемы с его попыткой, я подумал, что, возможно, они уже справляются, но их инструменты скрывают это от них.
 JNK06 окт. 2010 г., 21:35
Хорошая точка зрения! Я не обращался к этому, так как он не упомянул вызывающую заявку
 Branko Dimitrijevic06 янв. 2016 г., 11:44
Небольшое исправление: UNION ALL не используется по умолчанию. SQL Server не имеет UNION DISTINCT - просто UNION эквивалентен UNION DISTINCT.
 EJC06 окт. 2010 г., 21:41
Результаты этого запроса будут отправлены в формате HTML из приложения C # ... Этот подход все еще будет работать? Я не слишком углубился в приложение, которое вызывает SP, я просто знаю, что оно может вызвать SP, чтобы получить некоторые результаты, и тогда другая программа отправит результаты по электронной почте.
 JNK06 окт. 2010 г., 22:24
+1 за дополнительную помощь .NET :)
 Jon Hanna06 янв. 2016 г., 12:01
@BrankoDimitrijevic Правильно. Ректифицированный.
 Jon Hanna06 окт. 2010 г., 22:18
Это зависит от того, как приложение обрабатывает результаты, когда оно их получает. Наиболее распространенным поведением при использовании .NET результатов запроса было бы просто использовать первый набор результатов, хотя это может быть вызовNextResult() чтобы получить их всех. Если вы не можете изменить приложение и типы ваших двух наборов результатов совпадают, как это происходит в вашем вопросе, вы можете объединить их в один набор результатов. Я добавил к своему ответу код, который это делает.

В конце сохраненного процесса поместите:

SELECT * FROM @myTable1
SELECT * FROM @myTable2

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

 EJC06 окт. 2010 г., 22:04
Это не работает ... Я получаю сообщение об ошибке "необходимо объявить скалярную переменную @ myTable1" при выполнении предложения where "где @ myTable1.field0 = @ myTable2.field0" какие-либо мысли?
 JNK06 окт. 2010 г., 22:06
Пожалуйста, опубликуйте весь свой код в вопросе снова.
 JNK06 окт. 2010 г., 21:46
Имейте в виду, что на самом деле вы получите ТРИ набора результатов, так как похоже, что у вас есть один из выбора в конце вашего кода в OP.
 EJC06 окт. 2010 г., 22:07
хорошо, дайте мне минуту
 EJC06 окт. 2010 г., 21:31
Отлично, я попробую это в ближайшее время :)

Ваш ответ на вопрос