2017-04-17 8 views
0

同一の2つの異なるリンクサーバー(LATESTDUMP、OLDDUMP)で不一致レコードを取得するには、テーブル(SIB $)を比較する必要があります。私はすでに動的クエリを作成しようとしています。いくつか1つは私の助けを借りてください: 1)私はコードに列名を渡す必要はありませんし、コードは動的に列名を取得し、比較する列リストとして使用する方法はありますか?
だから私がしなければならないすべては私が働いている2人のテーブル名PROC保存リンクされたサーバーSQLのテーブルを動的に比較します

コードに渡すです:あなたは以来利用されていますMERGE文を見たいかもしれないよう

DECLARE @sql nvarchar(max) = ' ((SELECT * FROM LATESTDUMP...SIB$) t1 FULL 
OUTER JOIN (SELECT * FROM OLDDUMP...SIB$) t2 
ON t1.id = t2.id 
WHERE 
t1.id IS NULL OR 
t2.id IS NULL)' 

SELECT @sql += ' or t1.' + quotename(column_name) + ' <> t2.' + 
quotename(column_name) from information_schema.columns where table_name = 
'SIB$' 
+0

あなたの質問 –

答えて

0
+0

完全外部には適用されないタグを使用しないでください、私は静的または固定列を持っていたときに私のために完璧にうまく機能している入会しかし、私は私のテーブルの約200から220の列を持っていて、彼らは列の名前で変化し続けます。それは私がダイナミックSQLのために行く理由です – Nadeem

0

ここにいくつかのコードがあります。主キー(あなたのために有効な仮定であるかもしれないし、そうでないかもしれない1つの列主キーを仮定します)を引き出し、残りの列のカンマ区切りの文字列リストをつかみます。

ここから、split-stringを使用して、主キーのハードコードされたリンクサーバーから2つの同じ名前のテーブルを結合し、各列を相違点として比較し、次に動的SQL。あなたはそれを通じ働くことができるので、私はいくつかのテストの足場を用意しました:

DECLARE @tableName sysname; 
    SET @tableName = 'some table' 

    -- Validate parameter 
    IF @tableName IS NULL OR NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_TYPE = 'BASE TABLE') 
    BEGIN 
     RAISERROR ('Invalid table name specified', 16, 1); 
     RETURN; 
    END; 

    -- Validate table has a primary key 
    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @tableName) 
    BEGIN 
     RAISERROR ('Specified table does not have a primary key', 16, 1); 
     RETURN; 
    END; 

    -- Get info about the Primary Key columns 
    DECLARE @pkcolName sysname; 
    SELECT @pkcolName = c.COLUMN_NAME 
     FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
      INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME 
      INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON kcu.TABLE_NAME = c.TABLE_NAME AND kcu.COLUMN_NAME = c.COLUMN_NAME 
    WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND tc.TABLE_NAME = @tableName AND kcu.ORDINAL_POSITION = 1 

    -- Grab the names of all the remaining columns 
    DECLARE @nonKeyColumns nvarchar(MAX); 
    SELECT @nonKeyColumns = STUFF ((SELECT N'], [' + c.name 
       FROM sys.columns c 
       WHERE object_id = (select top 1 object_id FROM sys.objects where name = @tableName) 
       AND c.name <> @pkcolName 
       ORDER BY c.column_id 
       FOR XML PATH('')), 1, 2, '') + ']'; 

SELECT @pkcolName 
SELECT @nonKeyColumns 
+0

このコードは、リンクサーバーでは動作していないようです..あなたが確認してくださいと私にお知らせください – Nadeem

+0

このコードは、あなたが必要なものを構築するための単なるツールキットです。もちろん、リンクされたサーバーでは機能しません。情報を取得する方法の例にすぎません。リンクされたサーバーの名前が何であるか分かりません。適切な情報を取得するためにこれらのサーバー名を追加するだけです。これはローカルでテストするためのものです。 (たとえば、MyLinkedServer.INFORMATION_SCHEMA.TABLE_CONSTRAINTSおよびMyLinkedServer.sys.objects)。 – pmbAustin

関連する問題