Я хочу создать временную таблицу из вызова хранимой процедуры, как показано ниже.
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. Таким образом, определение фактической таблицы и ожидаемой таблицы не имеет смысла. Это пройдет каждый раз.
Отвечает ли это на ваш вопрос? Создать таблицу из n-го набора результатов хранимой процедуры
Спасибо @SMor Здесь, в приведенной выше ссылке, предлагается использовать SQLCLR. Я еще не исследовал его. Но он обязательно говорит, что нужно кодировать из окна SQL-сервера. Моя конечная цель - написать тестовый пример tSQLt, в котором я определю определение временной таблицы и сравним второй набор результатов моего процесса с его схемой. Так что в этом случае я не могу определить временную таблицу. В противном случае контрольный пример не имеет смысла.
T-SQL изначально не поддерживает отделение наборов данных от хранимой процедуры. Похоже, у вас должно быть 2 процедуры.
Возможно, лучше спросить, почему вы (или кто-то в вашей организации) решили написать хранимую процедуру для создания нескольких наборов результатов. Это проблематичный подход к разработке/написанию "единицы работы" в первую очередь - и, очевидно, что tsql не предназначен для обработки.
Да, я понимаю @SMor, но дело в том, что sp разработан очень давно таким образом. и большинство sps в приложении возвращают несколько наборов результатов. Итак, я хочу понять, как сравнить схему определенного набора результатов с моей ожидаемой схемой таблицы? Я на самом деле новичок в tSQLt. или это возможно каким-либо другим способом, чем тот, который я пытаюсь сделать?
Можете ли вы перенести хранимую процедуру в функции с табличным значением?
Короткий ответ - нет - вам были даны альтернативы. Начните программировать или измените свою цель/реализацию/использование tsqlt
Попробуйте так
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
На самом деле я тоже видел эту опцию, но она не включена на сервере нашей организации из соображений безопасности.
Предлагаются еще два варианта. Но также решите сами ограничения и перспективы производительности.
Но sys.dm_exec_describe_first_result_set_for_object можно использовать только для первого набора результатов. Я хочу получить доступ ко второму набору результатов из sp1.
Моя конечная цель - сравнить тип данных столбцов второго набора результатов. из 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'';'
«Как мы можем создать временную таблицу динамически ...... без определения временной таблицы». ?????