繁体   English   中英

在表1中记录对数据的更改,并在没有触发器的情况下将旧值和新值插入表2中

[英]Log changes to data in a table1 and insert the old and New value in Table2 without triggers

首先,我不是SQL专家,所以想实现以下功能,这对于SQL专家而言可能很容易实现。

实际上,我们要跟踪另一个“历史记录”表中一个表上每个条目的日志,其“列名”用于更新数据,而“更新后的列”的“旧”和“新”值是什么。

例如,如果我们更新Table1的Column1值,那么在历史记录表中,我们必须插入Column1的Old和New值以及列名本身(即,更新哪一列以及使用什么值)。

如果您不喜欢使用TRIGGERS ,则可以在以下方式使用OUTPUT

更新的答案

您可以将更新的值存储在不同的列中,如果未更新值,则可以传递NULL ,例如:

QUERY

UPDATE #t1
SET FirstName = 'bar',
    LastName = 'foobar'
OUTPUT  INSERTED.Id, 
        DELETED.FirstName, 
        CASE WHEN INSERTED.FirstName = DELETED.FirstName THEN NULL ELSE INSERTED.FirstName END, 
        DELETED.LastName, 
        CASE WHEN INSERTED.LastName = DELETED.LastName THEN NULL ELSE INSERTED.LastName END, 
        DELETED.City, 
        CASE WHEN INSERTED.City = DELETED.City THEN NULL ELSE INSERTED.City END
INTO #t2 (Id, [First Name - Old], [First Name - New], [Last Name - Old], [Last Name - New], [City - Old], [City - New])  

样本数据

CREATE TABLE #t1
(
    Id INT,
    FirstName NVARCHAR(MAX),
    LastName NVARCHAR(MAX),
    City NVARCHAR(MAX)

)
CREATE TABLE #t2
(
    Id INT,
    [First Name - Old] NVARCHAR(MAX),
    [First Name - New] NVARCHAR(MAX),
    [Last Name - Old] NVARCHAR(MAX),
    [Last Name - New] NVARCHAR(MAX),
    [City - Old] NVARCHAR(MAX),
    [City - New] NVARCHAR(MAX),
)
INSERT INTO #t1 VALUES (1, 'foo', 'foo2', 'foo3')

从更新表中输出

Id  [First Name - Old]  [First Name - New]  [Last Name - Old]   [Last Name - New]   [City - Old]    [City - New]
1   foo                 bar                 foo2                foobar              foo3            NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM