簡體   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