我有两张桌子,一张是历史,一张是实际的
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.输出表需要记录,只有更改列的条目。
答案 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 constructor
与cross 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