Динамическое создание временной таблицы из вызова хранимой процедуры

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

Select * 
into #temp1 
from 
    exec sp1;

или

select * 
into #temp1 
from sys.dm_exec_describe_first_result_set_for_object(object_id('dbo.sp1'), 1) 

чтобы получить второй набор результатов

Я знаю, что более поздняя опция используется только для получения первого набора результатов. Но я хочу получить n-й набор результатов и создать из него временную таблицу напрямую, не определяя временную таблицу.

Моя конечная цель - сравнить тип данных столбцов второго набора результатов из SP с моей ожидаемой схемой таблицы с использованием тестового примера tSQLt. Таким образом, определение фактической таблицы и ожидаемой таблицы не имеет смысла. Это пройдет каждый раз.

«Как мы можем создать временную таблицу динамически ...... без определения временной таблицы». ?????

Luuk 26.12.2020 14:11

Отвечает ли это на ваш вопрос? Создать таблицу из n-го набора результатов хранимой процедуры

SMor 26.12.2020 14:24

Спасибо @SMor Здесь, в приведенной выше ссылке, предлагается использовать SQLCLR. Я еще не исследовал его. Но он обязательно говорит, что нужно кодировать из окна SQL-сервера. Моя конечная цель - написать тестовый пример tSQLt, в котором я определю определение временной таблицы и сравним второй набор результатов моего процесса с его схемой. Так что в этом случае я не могу определить временную таблицу. В противном случае контрольный пример не имеет смысла.

user13875967 26.12.2020 14:31

T-SQL изначально не поддерживает отделение наборов данных от хранимой процедуры. Похоже, у вас должно быть 2 процедуры.

Thom A 26.12.2020 14:48

Возможно, лучше спросить, почему вы (или кто-то в вашей организации) решили написать хранимую процедуру для создания нескольких наборов результатов. Это проблематичный подход к разработке/написанию "единицы работы" в первую очередь - и, очевидно, что tsql не предназначен для обработки.

SMor 26.12.2020 15:18

Да, я понимаю @SMor, но дело в том, что sp разработан очень давно таким образом. и большинство sps в приложении возвращают несколько наборов результатов. Итак, я хочу понять, как сравнить схему определенного набора результатов с моей ожидаемой схемой таблицы? Я на самом деле новичок в tSQLt. или это возможно каким-либо другим способом, чем тот, который я пытаюсь сделать?

user13875967 26.12.2020 15:26

Можете ли вы перенести хранимую процедуру в функции с табличным значением?

John Cappelletti 26.12.2020 15:44

Короткий ответ - нет - вам были даны альтернативы. Начните программировать или измените свою цель/реализацию/использование tsqlt

SMor 26.12.2020 17:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
8
898
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте так

SELECT * INTO #temp1 FROM OPENROWSET('SQLNCLI','Server=YourServer;Trusted_Connection=yes;','exec DBName.Schema.sp1') AS a

Приведенный ниже вариант имеет ограниченный объем, так как «#Temp1» нельзя использовать за его пределами!

Declare @Table VARCHAR(MAX)=''
select @Table = @Table + ',' + [Name] + ' ' + system_type_name  from sys.dm_exec_describe_first_result_set_for_object(object_id('dbo.sp1'), 1) 
set @Table = stuff(@Table,1,1,'')
Exec('Create Table #temp1(' + @Table + ')
Insert #temp1
Exec dbo.sp1
')

Или

Приведенный ниже должен работать с «Глобальной таблицей Temp»

Declare @Table VARCHAR(MAX)=''
select @Table = @Table + ',' + [Name] + ' ' + system_type_name  from sys.dm_exec_describe_first_result_set_for_object(object_id('dbo.sp1'), 1) 
set @Table = stuff(@Table,1,1,'')
Exec('Create Table ##temp1(' + @Table + ')')

Insert ##temp1
Exec dbo.sp1

drop table ##temp1

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

user13875967 26.12.2020 14:57

Предлагаются еще два варианта. Но также решите сами ограничения и перспективы производительности.

SQLServerBuddy 26.12.2020 15:14

Но sys.dm_exec_describe_first_result_set_for_object можно использовать только для первого набора результатов. Я хочу получить доступ ко второму набору результатов из sp1.

user13875967 26.12.2020 15:20
Ответ принят как подходящий

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

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

Предположим, ваша тестируемая процедура выглядит как

CREATE PROCEDURE dbo.ProcedureUnderTest
AS
BEGIN

SELECT 1 AS ResultSet1Col1

SELECT 2 AS ResultSet2Col1, 'Foo' AS ResultSet2Col2

END

Вы можете достичь желаемой цели проверки формата второго набора результатов, вложив вызов tSQLt.ResultSetFilter в выполнение tSQLt.AssertResultSetsHaveSameMetaData

CREATE TABLE #expected
(
   ResultSet2Col1 INT NULL,
   ResultSet2Col2 VARCHAR(3) NULL
)


EXEC tSQLt.AssertResultSetsHaveSameMetaData
  @expectedCommand = 'SELECT * FROM #expected',
  @actualCommand = 'EXEC tSQLt.ResultSetFilter 2, ''EXEC dbo.ProcedureUnderTest'';' 

Другие вопросы по теме