2015-06-19 110 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個結果集的所有結果以及這兩個存儲過程,這些存儲過程可能需要太多內存。在這種情況下,控制檯應用程序是最好的選擇。