![](/img/trans.png)
[英]Hello Experts! I want to insert value to second table instead of first table using trigger
[英]I am looking for a way for a trigger to insert into a second table only where the value in table 1 changes
我正在尋找一種僅將表1中的值更改的地方插入第二張表的觸發器的方法。 從本質上講,它是一種捕獲任何更改的審核工具。 表1中的字段是price,我們要編寫其他字段。
到目前為止,這就是我所擁有的。
CREATE TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM]
FOR UPDATE
AS
insert into zmerps_Item_costprice_history
select NEWID(), -- unique id
GETDATE(), -- CURRENT_date
'PRICE_CHANGE', -- reason code
a.ima_itemid, -- item id
a.ima_price-- item price
FROM Inserted b inner join item a
on b.ima_recordid = a.IMA_RecordID
該表僅包含唯一標識符,日期,參考(項目)和更改的字段(價格)。 它會寫任何變化,而不僅僅是價格變化
這樣簡單嗎? 我移動了一些代碼,因為列之間的逗號后的注釋很難維護。 您還應該始終在插入語句中指定列。 如果您的表更改,此代碼仍將起作用。
CREATE TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM]
FOR UPDATE
AS
insert into zmerps_Item_costprice_history
(
UniqueID
, CURRENT_date
, ReasonCode
, ItemID
, ItemPrice
)
select NEWID()
, GETDATE()
, 'PRICE_CHANGE'
, d.ima_itemid
, d.ima_price
FROM Inserted i
inner join deleted d on d.ima_recordid = i.IMA_RecordID
AND d.ima_price <> i.ima_price
由於您沒有提供任何其他列名,因此在下面的示例中,我使用了Column2和Column3以及“其他”列名。
您可以在下面的代碼中展開添加更多列。
有關以下查詢的概述:
將已刪除和插入的表(僅針對已更改的行)連接到表本身,將導致對根本沒有更改的行進行不必要的處理。
如果列的值沒有更改,我已經使用NULLIF函數來產生一個空值。
將所有列轉換為相同的數據類型(unpivot必需)。
使用unpivot從結果集中消除所有空值。
unpivot還將為您提供已取消透視的列名。
CREATE TRIGGER zmerps_Item_costprice__update_history_tr
ON [ITEM]
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON ;
WITH CTE AS (
SELECT CAST(NULLIF(i.Price , d.Price) AS NVARCHAR(100)) AS Price
,CAST(NULLIF(i.Column2 , d.Column2) AS NVARCHAR(100)) AS Column2
,CAST(NULLIF(i.Column3 , d.Column3) AS NVARCHAR(100)) AS Column3
FROM dbo.inserted i
INNER JOIN dbo.deleted d ON i.IMA_RecordID = d.IMA_RecordID
WHERE i.Price <> d.Price
OR i.Column2 <> d.Column2
OR i.Column3 <> d.Column3
)
INSERT INTO zmerps_Item_costprice_history
(unique_id, [CURRENT_date], [reason code], Item_Value)
SELECT NEWID()
,GETDATE()
,Value
,ColumnName + '_Change'
FROM CTE UNPIVOT (Value FOR ColumnName IN (Price , Column2, Column3) )up
END
據我正確理解您的問題,您要記錄更改僅且僅當列價格值已更改時,您才需要記錄其他任何列更改
這是你的代碼
CREATE TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM]
FOR UPDATE
AS
if update(ima_price)
insert into zmerps_Item_costprice_history
select NEWID(), -- unique id
GETDATE(), -- CURRENT_date
'PRICE_CHANGE', -- reason code
a.ima_itemid, -- item id
a.ima_price-- item price
FROM Inserted b inner join item a
on b.ima_recordid = a.IMA_RecordID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.