使用表比较存储过程的两个版本的输出

时间:2017-06-08 07:44:38

标签: sql sql-server stored-procedures transactions

我有两个版本的存储过程,并希望确保它们的输出完全相同。我的单元测试和功能测试确实验证了两个版本是否相同。但是,在现场环境中使用较新版本的proc之前,我想确保它们匹配。

我正在尝试在实时数据库的副本上执行以下操作:

  1. 开始交易。
  2. 调用存储过程sproc_v1(proc内部修改表T1)。
  3. 从T1选择*进入T1_v1(条件是过滤掉受sproc_v1影响的行)
  4. 回滚事务(以便我有相同的初始条件来运行V2
  5. 调用存储过程sproc_v2
  6. 从T1
  7. 中选择*进入T1_v2

    很明显,在第3步之后 - T1_v1中的值也会回滚。可能是我可以将数据转储到文件中并比较文件。想知道是否有另一种方法可以进行这种匹配。

2 个答案:

答案 0 :(得分:1)

我总是使用excel。将第一个存储过程的结果粘贴到工作表1中,将第二个存储过程的结果粘贴到第二个工作表中,并比较第三个工作表中的值。

答案 1 :(得分:1)

您的结果集有多大?

一种方法可能是声明xml变量

DECLARE @xml1 XML, @xml2 XML;

...并使用

SET @xml1=(SELECT ... FOR XML RAW) --without the "INTO SomeTable"! Same with `@xml2` 

最后你可以使用

SELECT CASE WHEN CAST(@xml1 AS NVARCHAR(MAX))=CAST(@xml2 AS NVARCHAR(MAX)) THEN ...`

确保没有时间戳或其他可变内容,这当然会打扰......

更新

您可以使用声明的表变量,只要您的作业存在并且不受回滚影响,该变量就会存在:

而不是SELECT * INTO SomeTable使用INSERT INTO @tableVariable (col1, col2, ...) SELECT col1, col2, ... FROM ...

只需使用表的现有声明来创建表变量。无需手动输入所有列...

相关问题