2012-01-19 3 views
0

Я написал два SQL Server хранимых процедурSQL хранимая процедура объединить результат

Например:

create PROCEDURE query1 
AS 
SQL code here... 

create PROCEDURE query2 
AS 
SQL code here... 

Теперь я могу назвать их по отдельности, используя следующую команду, а возвращаемое значение состоит в следующем.

exec query1 

Study availability 
ACR  99.97% 

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

exec query1 
exec query2 

и это даст результат что-то вроде следующий, но как-то его сейчас работает его дать мне синтаксическую ошибку. Как объединить две хранимые процедуры и получить результаты в одном отчете?

Это T-SQL запрос

Study availability 
ACR  99.97% 
FOS  87.88% 
+1

Предоставление некоторого кода в дополнение к синтаксической ошибке может быть полезно для людей, читающих ваше сообщение – Dan

+0

Что нужно для этого? Инструмент отчетности, например Crystal Reports? –

ответ

1

Поскольку оба они возвращают одни и те же заголовки столбцов/типы данных, я рекомендую объединить два отдельных запроса в один запрос и использовать UNION ALL.

EX:

SELECT 'ACR'  AS Study, 
     SomeField AS Availability 
FROM SomeTable1 

UNION ALL 

SELECT 'FOS'  AS Study, 
     SomeField AS Availability 
FROM SomeTable2; 

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

+0

Вы на 100% верный, я попробовал ваш код, и он работает! Благодаря!! – Satish

6

Вы не можете называть их так, как вы описали (т.е. Exec Query1 Exec Query2). Вот одна альтернатива предполагая, что каждый прок возвращает одно значение:

declare @result as table (
ACR float, 
FOS float 
) 

INSERT INTO @result(ACR) 
exec query1 

INSERT INTO @result(FOS) 
exec query2 

SELECT ACR,FOS from @result 
+0

Замечательно! Благодаря!! – Satish

+0

Я попытался запустить ваш код и дать неверный синтаксис ошибки в два раза. Я запускаю этот код на сервере MS SQL 2008. – Satish

+0

@Satish Исправил мой ответ. У меня была ошибка в синтаксисе. Извини за это. – Icarus

1

Вы можете попробовать следующее:

exec query1; exec query2 

Но следует помнить, что результат не сочетается, вы просто получите результат обоих SPs как отдельные результирующие наборы.

+0

В вашем синтаксисе это просто дает мне единственный результат первого запроса. похоже, что он не выполняет второй запрос. Мне нужен отдельный результат. – Satish

0

Это зависит от вашего кода, вы можете вставлять результаты каждого SP в таблицу, а затем СОЕДИНЯТЬ их вместе, чтобы получить единый результирующий набор, который вы ищете, - но это часто бывает медленнее, если много строк поскольку вы делаете копии результатов, а не просто передаете их клиенту. И это разрывает способность оптимизатора совмещать вещи по границе, поскольку она должна записывать их во временные таблицы.

Если procs не является сложным, я бы подумал о том, чтобы сделать их в виде представлений или встроенных табличных функций. Их можно легко комбинировать с помощью других подпрограмм, таких как представления, функции или процедуры и сделать вещи более модульными.

+0

Я пробовал следовать за ним не работает exec query1 UNION exec query2 – Satish

+0

@Satish Правильно, вы не можете сделать это с помощью procs. Вот почему я сказал, что вы должны вывести их на стол, а затем выбрать союз. Кроме того, почему я предлагаю использовать другие конструкторы баз данных, если это возможно - например, с помощью табличных функций: SELECT * FROM TVF1 (params) UNION TVF2 (params) –

Смежные вопросы