通过调用存储过程动态创建临时 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'';'