2017-03-01 210 views
0

我想寫一個存儲過程來計算兩個輸入表之間的差異。如何使用存儲過程與表值參數比較兩個輸入表

存儲過程被用來計算(兩個表具有相同的預定義的表結構)中,存儲過程會提供記錄添加,刪除或比較表1〜表2

實施例時更新兩個表之間的差異:

  • 表1新的具有3個記錄:A,B和C
  • 表2具有3個記錄:B」,C和d

B」表示記錄B內的變化的一個或多個字段

這個存儲過程調用的輸出將是

A-addition 
B-update 
D-Removal 

我已書寫的查詢,以計算兩個表之間的差值,但發現很難翻譯成存儲過程。

表結構:

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

的這裏的問題不是關於表比較邏輯,而是首先將表作爲表值參數傳遞給表,然而對新比較邏輯的建議是受歡迎的。 –

+0

爲什麼表需要作爲參數傳入?爲什麼他們不能直接被SP引用? –

+0

因爲表格可能並不總是相同的表格,所以我想考慮將來的更改。因此編寫一個存儲過程。 –

0

我想你正在尋找合併句子。基於某些值源時,可以把表1爲目標,表2和決定如何處理的情況下,做匹配與否: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. 創建一個數據類型

    CREATE TYPE tableExample(X VAR CHAR(10), ÿINT, ž日期時間)

  2. 它傳遞給SP:

    CREATE PROC sp_mysp @ table1的tableExample,@表2 tableExample AS ...

+0

這裏的問題不是關於表比較邏輯,而是首先將表作爲表值參數傳遞給表,然而對新比較邏輯的建議是受歡迎的。 –

+0

所以你的問題是「如何在存儲過程中將表傳遞給參數?」 – asemprini87

+0

更新的問題。 –

相關問題