Как объединить наборы результатов из двух вызовов хранимых процедур? - PullRequest
8 голосов
/ 29 декабря 2011

У меня есть следующая хранимая процедура

CREATE PROCEDURE [dbo].[MyStored]
   @state int
AS
   SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0

и я хотел бы вызвать эту хранимую процедуру с @state, являющимися 0 и 1, и получить наборы результатов, возвращаемые обоими вызовами, в сочетании с семантикой UNION, чтобы у меня был новый набор результатов, в котором есть строки из как первый звонок, так и второй звонок.

Что-то вроде (воображаемый SQL):

(EXEC MyStored 0) UNION (EXEC MyStored 1);

Как мне этого добиться?

Ответы [ 5 ]

14 голосов
/ 29 декабря 2011

Возможно, это упрощает проблему, но если у вас есть контроль над sp, просто используйте вместо =:

CREATE PROCEDURE [dbo].[MyStored]
AS
   SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow;
RETURN 0

Если это не вариант, просто поместите результаты обоих вызовов sproc во временную таблицу:

/*Create a table with the same columns that the sproc returns*/
CREATE TABLE #tempblahblah(blahblahblah NVARCHAR(50))

INSERT #tempblahblah ( blahblahblah )
 EXEC MyStored 0

INSERT #tempblahblah ( blahblahblah )
 EXEC MyStored 1

SELECT * FROM #tempblahblah
5 голосов
/ 30 декабря 2011
create table #table ( 
    .....
)

insert into #table exec MyStored 0
insert into #table exec MyStored 1

select * from #table

drop table #table
3 голосов
/ 02 января 2012

В качестве альтернативы серии утверждений, подобных этим:

INSERT INTO #YourTempTable
EXEC MyStored 0;
INSERT INTO #YourTempTable
EXEC MyStored 1;

Вы можете использовать одно INSERT ... EXEC утверждение, как показано ниже:

INSERT INTO #YourTempTable
EXEC ('
  EXEC MyStored 0;
  EXEC MyStored 1;
');

Результаты двух вызовов MyStored будут иметь UNIONed (или, скорее, UNION ALLed), как и в предыдущем методе.

1 голос
/ 29 декабря 2011

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

Вы также можете использовать любую технологию, вызывающую эту процедуру, для объединения записей (т. Е. Добавление .NET к результирующему набору каждого состояния, к которому вы обращаетесь)

Если вы можете передать список состояний в ваш параметр 'state', вы можете создать динамический SQL-запрос

CREATE PROCEDURE [dbo].[MyStored]
   @state nvarchar(150)
AS

-- @state needs to be pre-formatted in a list for an in-clause  
--    i.e. 1,2,10   (if it was a string list, you'd need to do use double single quotes around the items - ''1'',''2'',''10''

DECLARE @SQL nVarChar(5000) = '
   SELECT blahblahblah 
   FROM LotsOfJoins
   WHERE StoredState in (' + @state + ')'


exec sp_executeSql @sql

Это прекрасно работает для простых процедур; хотя, если в будущем понадобятся изменения, обслуживание может занять больше времени.

.

Вот статья CodeProject и статья MS SQL Tips , которая лучше разбирается в деталях

.

РЕДАКТИРОВАТЬ: параметр @state должен быть nVarChar, так как вы передаете в список значений int с разделителями-запятыми

0 голосов
/ 31 мая 2016

Если хранимая процедура, которую вы вызываете, имеет временную таблицу с тем же именем, что и в вызывающей процедуре, вы получите эту ошибку.

например. SP1 имеет временную таблицу # результатов

sp2 создать таблицу #results (поля) тогда попытка вставить в #results в sp2 результат вызова sp1 потерпит неудачу с этой ошибкой. измените временную таблицу в sp2 на #result и попробуйте снова, и вы должны увидеть, что теперь это работает.

...