Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запись результатов работы процедуры во временную таблицу,  [new]
Digimot
Member

Откуда:
Сообщений: 3
MS SQL сам создает таблицу, если мы запускаем запрос вида

select
col1,
col2 as col3
into #tbl_tmp
from dbo.tbl_realdata

Можно ли сделать то же самое, но с процедурой?
Что то вроде :

Insert Into #Temp1 Exec dbo.sp_GetAllData @Name = 'Jason'.

Нашел пока 2 способа реализовать подобное:

https://stackoverflow.com/questions/42984503/how-to-insert-result-of-stored-procedure-into-temp-table-without-declaring-temp

OPENROWSET не подходит из-за необходимости указывать данные подключения к серверу, а второй способ с
sys.dm_exec_describe_first_result_set_for_object похоже работает только на простейших примерах, если есть несколько вариантов возвращаемых данных, используется with или темповые таблицы, он выдает ошибку.
Есть ли какие еще варианты?
2 фев 18, 13:59    [21160618]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36970
А что вы собрались делать с таблицой неизвестной структуры?
2 фев 18, 14:00    [21160627]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
Digimot
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич,

Сравнивать результаты до и после изменений, необходимо для тестирования.
2 фев 18, 14:12    [21160692]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Digimot
OPENROWSET не подходит из-за необходимости указывать данные подключения к серверу

Ещё OPENROWSET не подходит из-за невозможности выполнить любую процедуру, так можно выполнить только некоторые.

Можно в принципе попробовать написать CLR функцию...
2 фев 18, 15:07    [21160913]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Digimot,

ну в подобном извращении вышли через глобальную временную таблицу(мерзость :)). Или в процедуре сворачивать результаты в xml и возвращать его, потом разварачивать в таблицы
2 фев 18, 15:12    [21160935]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
TaPaK
Digimot,

ну в подобном извращении вышли через глобальную временную таблицу(мерзость :)). Или в процедуре сворачивать результаты в xml и возвращать его, потом разварачивать в таблицы
Это для нахождения различия рекордсетов двух произвольных процедур? :-)
2 фев 18, 15:16    [21160946]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
TaPaK
Digimot,

ну в подобном извращении вышли через глобальную временную таблицу(мерзость :)). Или в процедуре сворачивать результаты в xml и возвращать его, потом разварачивать в таблицы
Это для нахождения различия рекордсетов двух произвольных процедур? :-)

та нет конечно, класический костыль :)
2 фев 18, 15:48    [21161096]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Digimot,

14086351

Результат будет содержать данные и метаданные. Так что получить в результате временную таблицу - дело техники. Хотя имея xml-и, можно и без временных таблиц обойтись.
2 фев 18, 16:09    [21161225]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
Digimot,
Канонически процедуры должны возвращать код результата выполнения, никаких рекордсетов. Результат возвращают запросы. Но авторы серверов обычно применяют гибкий подход к потребителю с целью максимального сбора денежных средств :)
Если Вы сможете обойтись без получения табличных данных из процедуры, то избежите проблемы, создаваемой сильной связанностью кода. Просто архитектурный совет.
2 фев 18, 16:09    [21161227]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Владислав Колосов
Digimot,
Канонически процедуры должны возвращать код результата выполнения, никаких рекордсетов. Результат возвращают запросы. Но авторы серверов обычно применяют гибкий подход к потребителю с целью максимального сбора денежных средств :)
Если Вы сможете обойтись без получения табличных данных из процедуры, то избежите проблемы, создаваемой сильной связанностью кода. Просто архитектурный совет.
Интересно посмотреть, где такие каноны прописаны :-) У меня другие :-)
И что подразумевается под "сильной связанностью кода" в случае применения хранимых процедур для получения рекордсетов?
2 фев 18, 16:25    [21161294]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
Digimot
Member

Откуда:
Сообщений: 3
alexeyvg
Digimot
OPENROWSET не подходит из-за необходимости указывать данные подключения к серверу

Ещё OPENROWSET не подходит из-за невозможности выполнить любую процедуру, так можно выполнить только некоторые.


Об этом не знал, можно подробней про ограничения ?

TaPaK
Digimot,

ну в подобном извращении вышли через глобальную временную таблицу(мерзость :)). Или в процедуре сворачивать результаты в xml и возвращать его, потом разварачивать в таблицы


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

invm
Digimot,

14086351
Результат будет содержать данные и метаданные. Так что получить в результате временную таблицу - дело техники. Хотя имея xml-и, можно и без временных таблиц обойтись.


Почитаю, спасибо, похоже единственный вариант это xml?

Владислав Колосов
Digimot,
Канонически процедуры должны возвращать код результата выполнения, никаких рекордсетов.


Боюсь у нас такой подход не возможен, большая часть процедур возвращает таблицу или набор таблиц.
2 фев 18, 17:15    [21161455]     Ответить | Цитировать Сообщить модератору
 Re: Запись результатов работы процедуры во временную таблицу,  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Digimot
alexeyvg
Ещё OPENROWSET не подходит из-за невозможности выполнить любую процедуру, так можно выполнить только некоторые.
Об этом не знал, можно подробней про ограничения ?
Например:
SELECT a.*  
FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;',
     'exec sp_help') AS a;

Msg 11512, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1 [Batch Start Line 7]
The metadata could not be determined because the statement 'select
		            'Name'          = o.name,
		            'Owner'         = user_name(ObjectPro' in procedure 'sp_help' is not compatible with the statement 'select
		            'Name'          = o.name,
		            'Owner'         = user_name(ObjectPro' in procedure 'sp_help'.
2 фев 18, 18:14    [21161566]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить