2008-09-16 3 views
1

ここで私は仕事で解決しようとしている問題があります。私はデータベースのエキスパートではないので、これはちょっと古臭いです。すべての謝罪。SQL Serverに対称的な違いを実装していますか?

私はあるデータベースDを持っていますが、これは別のマシンに複製されています(おそらく疑わしい)。データベースDとD 'が実際に全く同じであることを確認するのは私の仕事です。

問題は、もちろん、そうでない場合は実際に何をするかです。この目的のために、私の考えは、それぞれの対応するテーブルに対称的な違いを実行し、その違いを確認することでした。

テーブルの数が多いため、手動で各対称差分を実行することは望ましくありません。列を明示的に列挙することなく、任意のテーブルで実行できる対称差分 "関数"(またはストアドプロシージャなど)を実装するにはどうすればよいですか?

これはWindows上で実行されており、実行しないとヘッジファンドが爆発します。がんばろう。

+0

OK、Red Gateは確かに解決策です。 これは非常に一般的な問題ではありませんか?プログラマチックな解決策はないはずですか? – Jake

答えて

1

私の最初の反応は、疑いのない方法でもう一方のマシンに複製を再度提案することです。

これはオプションではない場合は、おそらくRed Gateから利用できるツールのいくつかが必要なものを行うことができます。

(私はちょうど彼らのツールがポッドキャストにあったどのように良い言及ジョエルを覚えて、レッドゲートでaffliatedない方法でいます。)

+0

Ah。あなたはパンチに私を打つ! –

0

Red Gateでツールを比較SQLを使用してください。それはscheamasを比較し、SQL Data Compareツールはデータを比較します。私はあなたが彼らのために無料トライアルを受けることができると思うが、これが再発する問題であれば、それらを購入するかもしれない。このようなオープンソースやフリーのツールがあるかもしれませんが、ちょうどこれを取得するかもしれません。

2

ここに解決策があります。例えば、データはSSRS 2008 R2に付属しているレポートサーバーデータベースからですが、任意のデータセット上でそれを使用することができます。

SELECT s.name, s.type 
FROM 
(
    SELECT s1.name, s1.type 
    FROM syscolumns s1 
    WHERE object_name(s1.id) = 'executionlog2' 
    UNION ALL 
    SELECT s2.name, s2.type 
    FROM syscolumns s2 
    WHERE object_name(s2.id) = 'executionlog3' 
) AS s 
GROUP BY s.name, s.type 
HAVING COUNT(s.name) = 1 
1

SQL Server 2000は、ほぼ正確にOracleの」と同じである「EXCEPT」のキーワードを、追加しましたマイナス "

SELECT * FROM TBL_A WHERE ... 
EXCEPT 
SELECT * FROM TBL_B WHERE ... 
3

これを行うには、次のようにします。

私は、コンマ区切りの値をデモストレーションするためのテーブルに分割する機能を使用しました。

CREATE FUNCTION [dbo].[Split] 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END 
GO 


DECLARE @WB_LIST varchar(1024) = '123,125,764,256,157'; 
DECLARE @WB_LIST_IN_DB varchar(1024) = '123,125,795,256,157,789'; 

DECLARE @TABLE_UPDATE_LIST_IN_DB TABLE (id varchar(20)); 
DECLARE @TABLE_UPDATE_LIST TABLE (id varchar(20)); 

INSERT INTO @TABLE_UPDATE_LIST 
SELECT data FROM dbo.Split(@WB_LIST,','); 

INSERT INTO @TABLE_UPDATE_LIST_IN_DB 
SELECT data FROM dbo.Split(@LIST_IN_DB,','); 


SELECT * FROM @TABLE_UPDATE_LIST 
EXCEPT 
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB 
UNION 
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB 
EXCEPT 
SELECT * FROM @TABLE_UPDATE_LIST; 
関連する問題