2015-06-19 111 views
0

因此,类似于"SQL Server compare results of two queries that should be identical",我需要比较两个存储过程的输出以确保新版本生成与旧版本等效的输出。棘手的部分是我的SP输出六个不同宽度的表格。SQL Server - 比较输出多个表的两个存储过程的结果

我开始写他们的混合版本,将单独比较每个表,但它是一个非常复杂的SP,所以我希望有一个更简单的方法。

我尝试使用EXCEPT作为在链接的问题,但它看起来像只会比较一个表到另一个表。

+0

六张桌子之间有没有关系?它们碰巧是相同的宽度(列数)? –

+0

不,宽度不同。问题已更新。 – octothorpentine

回答

3

简单选项1:将存储过程结果输出到文本文件(每个过程版本一个),并使用diff工具/编辑器确保它们相同。简单选项2:将存储过程结果写入表/临时表(每个过程的每个返回表)并写入sql以比较结果。只需对每个结果表中的行进行计数,然后对两个表的联合(不是全部联合)进行计数。对每个结果表重复。

+0

简单选项2不能解决“我需要比较输出...”。但是,如果你输出到表/ temptable,那么我会简单地使用tablediff.exe工具(附带SQL工具)来比较这些表。我认为选项#1是最好/最简单的答案。 – Greg

+0

选项2也可以解决它。版本2是我的首选方式,因为它可以快速处理更大的输出。 – Ionic

1

我能想到的唯一的事情是为((新/旧)存储过程添加一个额外的参数来处理它应该返回的结果。

Exec usp_proc @var1 , @var2 , @ResultSet = 1 

以上执行应返回的第一个结果集,如果你通过@ResultSet = 2它应该返回第二个结果集等等.....

与两个存储过程做到这一点,然后比较结果逐组设置(使用除了会做的伎俩)。

+0

除非我遗漏了某些东西,否则输出参数不能为表值。 – octothorpentine

0

您可以很容易地捕获.NET(C#或VB)中的多个结果集。您可以创建一个DataAdapterDataSet,并使用DataAdapter.Fill()方法来填充DataSet。每个结果集将作为DataTable存储在该DataSet之内。然后您只需循环访问每个DataSet中的DataTables集合并进行比较。您可以在MSDN页面上找到更多信息:Populating a DataSet from a DataAdapter

如果要将其作为存储过程或用户定义的函数运行,或者它可以是独立的控制台应用程序,则可以在SQLCLR中完成此操作。将它作为SQLCLR存储过程运行非常方便,但考虑到您将存储所有6个结果集的所有结果以及这两个存储过程,这些存储过程可能需要太多内存。在这种情况下,控制台应用程序是最好的选择。