如何使用tSQLt比较存储过程返回的动态列结果集(无需预定义表结构)
解决tSQLt比较返回不同列结构的存储过程结果集问题
tSQLt的AssertEqualsTable要求待比较的两个结果集列数、列名、数据类型完全一致,而你的存储过程spa_Test根据参数返回不同结构的结果集,直接传入两个EXEC语句会因为元数据不匹配报错。以下是两种可行的解决方案:
方案一:统一结果集结构后比较
先将两个参数调用的结果集转换为包含所有可能列的统一结构(缺失列用NULL填充),再用AssertEqualsTable比较。
示例代码:
CREATE PROCEDURE Testspa_Test.CompareSpaTestResults AS BEGIN -- 创建包含所有可能列的临时表,数据类型需与存储过程返回的对应 CREATE TABLE #Result_Param1 ( A INT, -- 替换为存储过程实际返回的数据类型 B INT NULL, C INT NULL, D INT NULL, E INT NULL ); CREATE TABLE #Result_Param2 ( A INT, B INT NULL, C INT NULL, D INT NULL, E INT NULL ); -- 插入@Param1=1的结果,缺失列自动填充NULL INSERT INTO #Result_Param1 (A) EXEC dbo.spa_Test @Param1 = 1; -- 插入@Param1=2的结果,缺失列自动填充NULL INSERT INTO #Result_Param2 (A, B) EXEC dbo.spa_Test @Param1 = 2; -- 比较两个结果集 EXEC tSQLt.AssertEqualsTable '#Result_Param1', '#Result_Param2'; -- 清理临时表 DROP TABLE #Result_Param1; DROP TABLE #Result_Param2; END;
方案二:将结果集转为XML后比较
如果不需要严格的列结构匹配,仅比较数据内容,可以把结果集转为XML格式后用AssertEquals比较。此方法需开启Ad Hoc Distributed Queries配置,注意安全风险。
示例代码:
CREATE PROCEDURE Testspa_Test.CompareResultsAsXml AS BEGIN DECLARE @Xml_Param1 XML, @Xml_Param2 XML; -- 捕获@Param1=1的结果为XML SET @Xml_Param1 = ( SELECT * FROM OPENROWSET( 'SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'EXEC dbo.spa_Test @Param1=1' ) FOR XML AUTO, ELEMENTS ); -- 捕获@Param1=2的结果为XML SET @Xml_Param2 = ( SELECT * FROM OPENROWSET( 'SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'EXEC dbo.spa_Test @Param1=2' ) FOR XML AUTO, ELEMENTS ); -- 比较XML内容 EXEC tSQLt.AssertEquals @Xml_Param1, @Xml_Param2; END;
关键注意事项
- 方案一中的临时表数据类型必须与存储过程返回的列类型完全一致,否则插入或比较会报错。
- 方案二启用
Ad Hoc Distributed Queries需执行:sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;,操作前需评估安全影响。
内容的提问来源于stack exchange,提问作者user22515825
相关产品推荐
相关产品推荐

