因此,类似于"SQL Server compare results of two queries that should be identical",我需要比较两个存储过程的输出,以确保新版本生成与旧版本等效的输出。棘手的部分是我的SP输出六张不同宽度的表。
我开始编写它们的混合版本,可以单独比较每个表格,但它是一个非常复杂的SP,所以我希望有一个更简单的方法。
我尝试在链接问题中使用EXCEPT,但看起来只会将一个表与另一个表进行比较。
答案 0 :(得分:3)
简易选项1:将存储过程结果输出到文本文件(每个过程版本一个),并使用diff工具/编辑器确保它们是相同的。
简易选项2:将存储过程结果写入表/临时表(每个过程按返回表)并编写sql以比较结果。只计算每个结果表中的行,然后计算两个表的并集(不是union all)。对每个结果表重复一次。
答案 1 :(得分:1)
我唯一能想到的是为你的两个(新/旧)存储过程添加一个额外的参数来处理它应该返回的结果。
Exec usp_proc @var1 , @var2 , @ResultSet = 1
上面的执行应该返回第一个结果集,如果你传递@ResultSet = 2
它应该返回第二个结果集等等......
使用两个存储过程执行此操作,然后逐组比较结果集(使用except将执行此操作)。
答案 2 :(得分:0)
您可以非常轻松地在.NET(C#或VB)中捕获多个结果集。您可以创建DataAdapter
和DataSet
,并使用DataAdapter.Fill()
方法填充DataSet
。每个结果集将在DataTable
内存储为DataSet
。然后,您只需遍历每个DataTables
中的DataSet
集合并进行比较。您可以在此MSDN页面上找到更多信息:Populating a DataSet from a DataAdapter
如果要将其作为存储过程或用户定义的函数运行,可以在SQLCLR中完成,或者它可以是独立的控制台应用程序。将它作为SQLCLR存储过程运行是非常方便的,但考虑到您将存储所有6个结果集的所有结果,并且对于您正在测试的两个存储过程,可能需要太多内存。在这种情况下,控制台应用程序是最佳选择。