2017-03-01 14 views
0

2つの入力テーブル間の差異を計算するストアドプロシージャを作成しようとしています。2つの入力テーブルを比較するためにテーブル値パラメータでストアドプロシージャを使用する方法

ストアドプロシージャが二つのテーブル(両方のテーブルが同一の事前定義されたテーブル構造を有する)との間の差を計算するために使用される、ストアドプロシージャは、レコードを提供する表1を比較するときに削除または更新され、追加されたテーブルに2

例:B」、C及びD :表2は、3つのレコードがA、B及びC

    • 表1新3つのレコードを有しています0

      B」は、このストアドプロシージャ呼び出しの出力は

      A-addition 
      B-update 
      D-Removal 
      

      あろうレコードB内の1つまたは複数のフィールドに変更

      を示し、私は2つのテーブル間の差を計算するために、クエリを書かれています、ストアドプロシージャに変換するのが難しいことがわかりました。

      表構造:

      X varchar (10) 
      Y int 
      Z datetime 
      
      
      SELECT 
          table1.*, ChangeType = 'Addition' 
      FROM 
          table1 
      WHERE 
          NOT EXISTS (SELECT * 
             FROM table2 
             WHERE table1.x = table2.x) 
      
      UNION ALL 
      
      SELECT 
          table2.*, ChangeType = 'Removal' 
      FROM 
          table2 
      WHERE 
          NOT EXISTS (SELECT * 
             FROM table1 
             WHERE table1.x = table2.x) 
      
      UNION ALL 
      
      SELECT 
          table1, ChangeType = 'Update' 
      FROM 
          table2 
      INNER JOIN 
          table1 ON table1.x = table2.x 
      WHERE 
          table1.Y <> table2.Y OR table1.Z <> table2.Z 
      

      も同様に、ストアドプロシージャの実行スクリプトを記載してください。

  • 答えて

    -1

    私は、アクションを分類するためにcase文を使用して、シングルパスを使用する方が好きです。

    CREATE PROCEDURE CompareTables 
    AS 
    BEGIN 
        SELECT ChangeType = CASE 
              WHEN table2.x IS NULL THEN 
              'Addition' 
              WHEN table1.x IS NULL THEN 
              'Removal' 
              WHEN table1.Y <> table2.Y 
               OR table1.Z <> table2.Z THEN 
              'Update' 
              ELSE 
              'No Change' 
             END, 
          table1.*, 
          table2.* 
        FROM table2 
        FULL OUTER JOIN table1 
         ON table1.x = table2.x 
        WHERE table2.x IS NULL 
         OR table1.x IS NULL 
         OR NOT (table1.Y = table2.Y 
            AND table1.Z = table2.Z 
           ); 
    END; 
    
    +0

    AS PROC sp_mysp @ TABLE1 tableExample、@ table2のtableExample をCREATEここでの質問は、テーブル比較ロジックについてではなく、最初にテーブル値パラメータとしてテーブルを渡すことですが、新しい比較ロジックへの提案は歓迎されます。 –

    +0

    テーブルをパラメータとして渡す必要があるのはなぜですか?なぜ彼らはSPによって直接参照されるだけではありませんか? –

    +0

    テーブルが常に同じテーブルであるとは限りませんので、今後の変更を許可したいと思います。したがって、ストアドプロシージャを書く。 –

    0

    あなたはMERGE文を探していると思います。あなたは、特定の値に基づいて、ソースとターゲットとtable2のようTABLE1を入れて、一致する場合にはか何をすべきかを決定することができますhttps://msdn.microsoft.com/en-us/library/bb510625.aspx

    あなたのケースでは、それはのようになります。どのようにしたよう

    MERGE table1 AS target 
    USING table2 AS source (x, y, z) 
    ON (target.x= source.x) 
    WHEN MATCHED 
    --do something 
    WHEN NOT MATCHED BY TARGET 
    --do something different 
    WHEN NOT MATCHED BY SOURCE 
    --something else 
    

    SPにパラメータとしてテーブルを受け取るために、あなたは、次の手順に従う必要があります:

    1. をデータ型を作成します

      TYPEのtableExample(XのVARをCREATE CHAR(10)、 Y int型、 Z日時)SPへ

    2. パスを:

      が...

    +0

    ここでの質問は、テーブル比較ロジックについてではなく、最初にテーブル値パラメータとしてテーブルを渡すことですが、新しい比較ロジックへの提案は歓迎されます。 –

    +0

    あなたの質問はどのように私はストアドプロシージャのパラメータとしてテーブルを渡すのですか? – asemprini87

    +0

    質問が更新されました。 –

    関連する問題