通过调用存储过程动态创建临时 table
Create a temporary table dynamically from calling an stored procedure
我想创建一个临时的 table 通过调用如下所示的存储过程
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 个结果集并直接从中创建一个临时 table 而无需定义临时 table.
我的最终目标是使用 tSQLt 测试用例将来自 SP 的第二个结果集的列数据类型与我预期的 table 模式进行比较。因此定义实际 table 和预期 table 没有任何意义。每次都会过去。
试试这个方法
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
')
或者
下面的应该适用于“全局温度 table”
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
My ultimate goal is to compare columns data type of a 2nd resultset
from an SP with my expected table schema using tSQLt test case.
将返回第二个结果集的代码重构到它自己的过程中将使这更容易测试,但它是可行的。
假设您的测试程序看起来像
CREATE PROCEDURE dbo.ProcedureUnderTest
AS
BEGIN
SELECT 1 AS ResultSet1Col1
SELECT 2 AS ResultSet2Col1, 'Foo' AS ResultSet2Col2
END
您可以通过嵌套调用 tSQLt.ResultSetFilter
inside an execution of 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'';'
我想创建一个临时的 table 通过调用如下所示的存储过程
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 个结果集并直接从中创建一个临时 table 而无需定义临时 table.
我的最终目标是使用 tSQLt 测试用例将来自 SP 的第二个结果集的列数据类型与我预期的 table 模式进行比较。因此定义实际 table 和预期 table 没有任何意义。每次都会过去。
试试这个方法
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
')
或者
下面的应该适用于“全局温度 table”
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
My ultimate goal is to compare columns data type of a 2nd resultset from an SP with my expected table schema using tSQLt test case.
将返回第二个结果集的代码重构到它自己的过程中将使这更容易测试,但它是可行的。
假设您的测试程序看起来像
CREATE PROCEDURE dbo.ProcedureUnderTest
AS
BEGIN
SELECT 1 AS ResultSet1Col1
SELECT 2 AS ResultSet2Col1, 'Foo' AS ResultSet2Col2
END
您可以通过嵌套调用 tSQLt.ResultSetFilter
inside an execution of 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'';'