SQL Server 2005のストアドプロシージャをパフォーマンスのために少し変更していますが、古いストアドプロシージャと新しいプロシージャが同じ結果を返すことを確認したいと思います列は同じです、私は行が同じであることを確認したい)。SQL Serverは2つのクエリの結果が同一であることを比較します
SQL Server 2005でこれを行う簡単な方法はありますか?
SQL Server 2005のストアドプロシージャをパフォーマンスのために少し変更していますが、古いストアドプロシージャと新しいプロシージャが同じ結果を返すことを確認したいと思います列は同じです、私は行が同じであることを確認したい)。SQL Serverは2つのクエリの結果が同一であることを比較します
SQL Server 2005でこれを行う簡単な方法はありますか?
次の2つのクエリの間で一致する構造を除いて使用することができます。
select * from (select * from query1) as query1
except
select * from (select * from query2) as query2
EDIT:次に
ドライバーとしてQUERY2との相違点を見つけるために、クエリをリバース:
select * from (select * from query2) as query2
except
select * from (select * from query1) as query1
プロシージャごとに1つずつ、2つの一時表を作成します。 行を適切な表に挿入するプロシージャを実行します。
、その後1から選択* MINUS他から*を選択し、その逆
MINUS T-SQLと等価 – flash
create table #OldProcResults (
<Blah>
)
create table #NewProcResults (
<Blih>
)
insert into #OldProcResults
exec MyOldProc
insert into #NewProcResults
exec MyNewProc
その後、2つのテーブルを比較するのジャブの答えを使用しています。
以下のストアドプロシージャは、2つのストアドプロシージャまたは2つのステートメントの出力結果セットを比較します。ここで重要なのは、SP は結果セットの構造またはスキーマを知る必要がないため、任意のSPを任意にテストできます。出力が同じ場合は0行が返されます。このソリューションは、SQL Serverでopenrowsetコマンドを使用します。ここ は、SPは、本番環境のための理想的な、しかしローカルQA、DEVとテスト環境に非常に有用ではないかもしれない次の前提条件を必要とストアドプロシージャ
DECLARE @SQL_SP1 VARCHAR(MAX)
DECLARE @SQL_SP2 VARCHAR(MAX)
-- Compare results of 2 Stored Procs
SET @SQL_SP1 = 'EXEC SomeDB.dbo.[usp_GetWithTheProgram_OLD] 100, ''SomeParamX'''
SET @SQL_SP1 = 'EXEC SomeDB.dbo.[usp_GetWithTheProgram_NEW] 50, ''SomeParamX'''
EXEC utlCompareStatementResults @SQL_SP1, @SQL_SP2
-- Compare just 2 SQL Statements
SET @SQL_SP1 = 'SELECT * FROM SomeDB.dbo.Table1 WHERE CreatedOn > ''2016-05-08'''
SET @SQL_SP1 = 'SELECT * FROM SomeDB.dbo.Table1 WHERE CreatedOn > ''2016-06-11'''
EXEC utlCompareStatementResults @SQL_SP1, @SQL_SP2
のいくつかのサンプルの使用です。コード内でopenrowsetを使用します。
EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'ad hoc distributed queries', 1
EXEC sp_serveroption @@SERVERNAME, 'DATA ACCESS', TRUE
ここに、ストアドプロシージャのコードがあります。
==================================================================================
--== SUMMARY utlCompareStatementResults
--== - requires sp_configure 'show advanced options', 1
--== - requires sp_configure 'ad hoc distributed queries', 1
--== - maybe requires EXEC sp_serveroption @@SERVERNAME, 'DATA ACCESS', TRUE
--== - requires the RecordSet Output to have Unique ColumnNames (no duplicate columns)
--== - requires references in straight SQL to be fully qualified [dbname].[schema].[objects] but not within an SP
--== - requires references SP call to be fully qualifed [dbname].[schema].[spname] but not objects with the SP
--== OUTPUT
--== Differences are returned
--== If there is no recordset returned, then theres no differences
--== However if you are comparing 2 empty recordsets, it doesn't mean anything
--== USAGE
--== DECLARE @SQL_SP1 VARCHAR(MAX)
--== DECLARE @SQL_SP2 VARCHAR(MAX)
--== -- Compare just 2 SQL Statements
--== SET @SQL_SP1 = 'SELECT * FROM SomeDB.dbo.Table1 WHERE CreatedOn > ''2016-05-08'''
--== SET @SQL_SP1 = 'SELECT * FROM SomeDB.dbo.Table1 WHERE CreatedOn > ''2016-06-11'''
--== EXEC utlCompareStatementResults @SQL_SP1, @SQL_SP2
--==
--== -- Compare results of 2 Stored Procs
--== SET @SQL_SP1 = 'EXEC SomeDB.dbo.[usp_GetWithTheProgram_OLD] 100, ''SomeParamX'''
--== SET @SQL_SP1 = 'EXEC SomeDB.dbo.[usp_GetWithTheProgram_NEW] 50, ''SomeParamX'''
--== EXEC utlCompareStatementResults @SQL_SP1, @SQL_SP2
--==================================================================================
CREATE PROCEDURE utlCompareStatementResults
@SQL_SP1 VARCHAR(MAX),
@SQL_SP2 VARCHAR(MAX)
AS
BEGIN
DECLARE @TABLE1 VARCHAR(200)
DECLARE @TABLE2 VARCHAR(200)
DECLARE @SQL_OPENROWSET VARCHAR(MAX)
DECLARE @CONNECTION VARCHAR(100)
SET @CONNECTION = 'server='[email protected]@SERVERNAME+';Trusted_Connection=yes'
SET @SQL_SP1 = REPLACE(@SQL_SP1, '''','''''')
SET @SQL_SP2 = REPLACE(@SQL_SP2, '''','''''')
SET @TABLE1 = '#' + SUBSTRING(CONVERT(VARCHAR(250),NEWID()), 1, 8)
SET @TABLE2 = '#' + SUBSTRING(CONVERT(VARCHAR(250),NEWID()), 1, 8)
SET @SQL_OPENROWSET =
'SELECT * ' + ' ' +
'INTO ' + @TABLE1 + ' ' +
'FROM OPENROWSET(''SQLNCLI'', ' + '''' + @CONNECTION + '''' +
',''' + @SQL_SP1 +'''); ' +
'SELECT * ' + ' ' +
'INTO ' + @TABLE2 + ' ' +
'FROM OPENROWSET(''SQLNCLI'', ' + '''' + @CONNECTION + '''' +
',''' + @SQL_SP2 +'''); ' +
'(SELECT * FROM ' + @TABLE1 + ' EXCEPT SELECT * FROM ' + @TABLE2 + ') ' +
' UNION ALL ' +
'(SELECT * FROM ' + @TABLE2 + ' EXCEPT SELECT * FROM ' + @TABLE1 + '); ' +
'DROP TABLE ' + @TABLE1 + '; ' +
'DROP TABLE ' + @TABLE2 + '; '
PRINT @SQL_OPENROWSET
EXEC (@SQL_OPENROWSET)
PRINT 'DifferenceCount: ' + CONVERT(VARCHAR(100), @@ROWCOUNT)
END
であり、それを逆(上記の例のように)を除く、Oracleの文です。 – user1166147
はい - @ user1166147説明をありがとう。 – jabs
これは重複を破棄することに注意してください。したがって、クエリ1が1つのレコードを返し、クエリ2が2つのレコードを互いに同一で、クエリ1からの単一のレコードに返す場合、 "except"ロジックはゼロ行を返します。 –