Sql 比较两个不同表中两行的更新列

Sql 比较两个不同表中两行的更新列,sql,sql-server,Sql,Sql Server,我有两张桌子,一张是历史的,一张是实际的 ActualCalcID DSID FormatID RollupId BD BID DFID FMID Year Name TID SID TyId ------------ --------

我有两张桌子,一张是历史的,一张是实际的

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
历史表

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
实际的

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
当用户单击UI中的按钮时,在触发器的帮助下(基本上是存档),ActualTable中的行将移动到HistoryTable

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
我需要在触发器运行完成时更改了哪些列,格式如下

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
Changed Field | Changed Field Content

FormatId | 3

Rollup Id | 2

BD | Test Edit VB1

FMID | 2

Name | CCG Contribution Margin (000s) - Test1

TID | 5

TypeId | 5

我想我的问题问得不恰当。我想比较历史表中最新的行和实际表中的行,以检查哪些列已更改。在不同的时间可能会有所不同,有时会有4列更改,有时是5列,有时是1列。输出表只需记录更改列的条目。

您可以使用
UNION ALL

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
SELECT 'FormatId' AS [Changed Field], CONVERT(VARCHAR(100), FormatId) AS [Changed Field Content] FROM Actual UNION ALL
SELECT 'Rollup Id', CONVERT(VARCHAR(100), RollupId) FROM Actual UNION ALL
SELECT 'BD', CONVERT(VARCHAR(100), BD) FROM Actual UNION ALL
SELECT 'FMID', CONVERT(VARCHAR(100), FMID) FROM Actual UNION ALL
SELECT 'Name', CONVERT(VARCHAR(100), Name) FROM Actual UNION ALL
SELECT 'TID', CONVERT(VARCHAR(100), TID) FROM Actual UNION ALL
SELECT 'TypeId', CONVERT(VARCHAR(100), TID) FROM Actual

表值构造函数
交叉应用
一起使用,以取消对数据的抽取

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
select [Changed Field] , [Changed Field Content]
from yourtable
cross apply
(
values ('FormatId',CONVERT(VARCHAR(100), FormatId)),
(Rollup Id', CONVERT(VARCHAR(100), RollupId)),
('BD', CONVERT(VARCHAR(100), BD)),
('FMID', CONVERT(VARCHAR(100), FMID)),
('Name', CONVERT(VARCHAR(100), Name)),
('TID', CONVERT(VARCHAR(100), TID)),
('TypeId', CONVERT(VARCHAR(100), TID))
) 
cs ([Changed Field] , [Changed Field Content])

您可以在
INSERT
之后使用
OUTPUT
来获取插入的行。你需要在你的触发器中应用这个

ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          3           1           Test Edit VB                             2           1           1           2016        CCG Contribution Margin (000s) - Test    4           101         3
18           40          3           1           Test Edit VB1                            2           1           1           2016        CCG Contribution Margin (000s) - Test1   4           101         3
ActualCalcID DSID        FormatID    RollupId    BD                                       BID         DFID        FMID        Year        Name                                     TID         SID         TyId
------------ ----------- ----------- ----------- ---------------------------------------- ----------- ----------- ----------- ----------- ---------------------------------------- ----------- ----------- -----------
18           40          4           2           Test Edit VB2                            2           1           2           2016        CCG Contribution Margin (000s) - Test2   5           101         5
DECLARE @TableVar TABLE(
    ChangedField VARCHAR(50)                       
    ,FormatId INT
    ,RollupId INT
    ,BD VARCHAR(50)
    ,FMID INT
    ,Name VARCHAR(250)
    ,TID INT
    ,TypeId INT
)

INSERT HistoryTable
    OUTPUT 'Changed Field Content'
            ,inserted.FormatId
            ,inserted.RollupId
            ,inserted.BD
            ,inserted.FMID
            ,inserted.Name
            ,inserted.TID
            ,inserted.TypeId
        INTO @TableVar
VALUES ('', '', ...)

SELECT * FROM @TableVar

可以将联合与硬编码的列名称一起使用,也可以查询元数据以动态执行(这样在添加或删除列时它仍然有效)。后者有点复杂,因为您还需要使用动态sql。我想比较历史表中的最新行和实际表中的行,以检查哪些列已更改。在不同的时间可能会有所不同,有时会有4列更改,有时是5列,有时是1列。输出表只需记录更改列的条目。这可以动态完成吗?任何指示都会有帮助的好吧。假设你得到了那个信息。你到底打算用它做什么?如果,正如您所推断的,只有更改的列被写入历史记录表,这意味着示例历史记录表的第二行将是(null,null,null,null,Test Edit VB1)。如果确实是这样的话,要找到每个字段最后一个不变的值将非常困难。我确实需要它。UI中的字段映射到DB。假设UI中有5个字段。从实际表中取前五列…这些字段的当前DB值为18,40,4,2,测试编辑VB2…现在我转到UI…将第一个和第三个字段从18,4更改为19,5。实际表格中的当前行将使用触发器插入历史表格,新行将插入值为19,40,5,2的实际值,测试编辑VB2。现在我想创建一个报告,该报告将显示这两个值已从上次更新更改。类似地,在下一次编辑中,我将测试编辑VB2更新为测试编辑VB3。实际值中的当前行移动到历史记录,实际值将具有19,40,5,2,测试编辑VB3。。报告将显示一个字段从上次更新(即BD列)更改。输出表将有两列更改字段和内容,该表中插入的记录将是实际更改的列,其值可能是旧值或新值。