Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение процедур (union для exec)  [new]
Гость сайта
Guest
Уважаемые коллеги!
Имеется - процедура, которая получает неопределенное количество параметров и возвращает,
в соответствии с параметрами, таблицу с неопределенным кол-вом столбцов.

Хочу сделать объединение результатов выполнения нескольких таких процедур.
Между собой у всех этих процедур кол-во входных параметров и размерность выходных таблиц одинаковая.

Насколько я понял, union для exec не допускается использовать.
Какие варианты решения возможны?
Спасибо!
13 сен 15, 07:28    [18143556]     Ответить | Цитировать Сообщить модератору
 Re: Объединение процедур (union для exec)  [new]
max44
Member

Откуда: МОСКВА
Сообщений: 280
1. Написать еще одну процедуру, объеденяющую работу всех ваших процедур, которые вы хотите объединить...

2. записывать результат выполнения ваших ХП во временную таблицу, из которой потом сделать SELECT
13 сен 15, 10:15    [18143622]     Ответить | Цитировать Сообщить модератору
 Re: Объединение процедур (union для exec)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Гость сайта
Хочу сделать объединение результатов выполнения нескольких таких процедур.
Если в процедуре не выводить результирующий набор из временной таблицы или заменить ее на табличную переменную, то можно так:
+
use tempdb;
go

create procedure dbo.p1
 @a int,
 @b int,
 @c int

as
begin
 set nocount on;

 declare @t table (a int, b int, c int);
 insert into @t values (@a, @b, @c);
 select * from @t;
end;
go

create procedure dbo.p2
 @a int,
 @b int,
 @c int

as
begin
 set nocount on;

 declare @t table (a int, b int, c int);
 insert into @t values (@a, @b, @c);
 select * from @t;
end;
go

declare
 @s varchar(max) = '''SQLNCLI'', ''Server=' + @@servername + ';Trusted_connection=yes;''',
 @p1 varchar(max) = '''exec tempdb.dbo.p1 1, 2, 3;''',
 @p2 varchar(max) = '''exec tempdb.dbo.p2 4, 5, 6;''';

declare
 @query varchar(max) = 'select * from openrowset(' + @s + ', ' + @p1 + ') union all select * from openrowset(' + @s + ', ' + @p2 + ');'; 

exec(@query);
go

drop procedure dbo.p1, dbo.p2;
go
13 сен 15, 11:53    [18143692]     Ответить | Цитировать Сообщить модератору
 Re: Объединение процедур (union для exec)  [new]
Гость сайта
Guest
Спасибо max44 и invm!

Хотелось обойтись без временной таблицы, так как у меня несколько десятков вариаций массивов
входных параметров и столько же столбцов возвращается в результирующем наборе.
Поэтому переделал процу в функцию, так с функции проще вернуть без заморочек.
declare @sql varchar(4000)
set @sql =
   (select dbo.myfunc (...array_params1...)) + ' union all ' +
   (select dbo.myfunc (...array_params2...)) ...
exec(@sql)
13 сен 15, 13:34    [18143782]     Ответить | Цитировать Сообщить модератору
 Re: Объединение процедур (union для exec)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Гость сайта
Поэтому переделал процу в функцию
А функции уже научились возвращать наборы с переменным количеством столбцов?
13 сен 15, 13:59    [18143820]     Ответить | Цитировать Сообщить модератору
 Re: Объединение процедур (union для exec)  [new]
Гость сайта
Guest
invm,

8)) не так выразился, в функции собираю запрос и вывожу в exec
13 сен 15, 14:14    [18143848]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить