Как объединить записи двух хранимых процедур, не зная столбцов - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть 2 хранимые процедуры, которые возвращают одинаковые, но неизвестные столбцы.Мне нужно написать процедуру, чтобы объединить результаты обеих хранимых процедур.Я пробовал OPENROWSET, но проблема в том, чтобы предоставить строку соединения в функции OPENROWSET, даже если я укажу строку соединения один раз, она будет отличаться для разных сред, и я думаю, что будет хуже всего менять строку соединения каждый раз, когда я развертываюприложение в разных средах или если пользователь меняется на сервере.Может кто-нибудь помочь мне сделать это наилучшим образом.

Я не могу написать их как функцию, так как процесс использует временные таблицы.

Declare @connection nvarchar(200)
Declare @sql nvarchar(max)
Set @connection= 'Server=servername;initial 
catalog=dbname;user=abc,password=xyz';
Set @sql='SELECT * INTO #temp1
FROM OPENROWSET(
           ''SQLNCLI'',
           '''+ @connection + ''',
           ''EXEC sp_name '')'

Exec(@sql)

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Это возможно, но совсем не просто ....

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

Чтобы использовать OPENROWSET, как вы это делаете в текущем подходе, вам также понадобится глобальная временная таблица, но, как вы упомянули, что ваши хранимые процедуры используют временные таблицы, OPENROWSET, OPENQUERY или sys.dm_exec_describe_first_result_set не смогутчтобы определить метаданные для создания временной таблицы.

Другой вариант - изменить хранимые процедуры на использование таблиц переменных вместо временных таблиц, после чего метаданные могут быть переопределены.Ответ @ chrszcpl https://stackoverflow.com/a/55632401/10932521 - очень хорошее решение, если вы можете это сделать.

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

0 голосов
/ 11 апреля 2019
--- creating a temporary table
CREATE Table #Dynamic_Temp_Table (_field_only_for_create_ INT )

--- Addition of fields from the first recordset from the first procedure
DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL=ISNULL(@SQL+',','ALTER TABLE #Dynamic_Temp_Table ADD ')+name+' '+system_type_name 
    FROM sys.dm_exec_describe_first_result_set('exec sp_proc_first', NULL, NULL) 
    order by column_ordinal
exec sp_executesql @SQL 

--- Remove of the first unused column
ALTER TABLE #Dynamic_Temp_Table drop column _field_only_for_create_

--- Addition of the result from the first procedure
INSERT INTO #Dynamic_Temp_Table
exec sp_proc_first

--- Addition of the result from the second procedure
INSERT INTO #Dynamic_Temp_Table
exec sp_proc_second

--- result:  exec sp_proc_first UNION ALL exec sp_proc_second
select * from #Dynamic_Temp_Table
--- result: exec sp_proc_first UNION exec sp_proc_second
select DISTINCT * from #Dynamic_Temp_Table
...