2017-03-01 45 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

更新的问题。 –

相关问题