比较两个不同表中的两行以获取更新的列

时间:2015-03-13 00:43:48

标签: sql sql-server

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

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

ActualTable

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(基本上是Archiving)。

我需要在触发器运行完成后更改哪些列,格式如下

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.输出表需要记录,只有更改列的条目。

3 个答案:

答案 0 :(得分:0)

您可以使用UNION ALL

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

答案 1 :(得分:0)

Table valued constructorcross apply一起使用以取消数据

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])

答案 2 :(得分:0)

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

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