[英]SQL Server trigger if update() with condition
我在 SQL Server 中有一个包含 3 列的表: ID
、 NAME
、 VALUE
。
该表有 2 行ID=1
和ID=2
。
(ID 的值不变)。
每时每刻, VALUE
列的值都会发生变化。 每次VALUE
列发生变化时,我都想将这个更新后的值插入到表中(ID=1 的设备 1,ID=2 的设备 1)。
我创建了一个更新触发器,就像 update(VALUE) 开始一样......但它不起作用。
有没有办法在 if update(VALUE) 中添加条件以在每一行中工作
我使用了这个查询
Create Trigger insertIntoDevices
On ITEMS
For Update
As
If Update(VALUE)
Begin
Insert Into table device1
Where ID = 1
Insert Into table device2
Where ID = 2
End
通过此查询,VALUE 列中的每个更新都会将 VALUE 插入到 device1 和 device1 中,这会复制我的表 device1 和 device2 中的值。
在下面创建表;
CREATE TABLE TestTable(
ID INT IDENTITY(1,1),
Name VARCHAR(5),
VALUE NVARCHAR(50)
)
GO
CREATE TABLE device1(
VALUE NVARCHAR(50)
)
GO
CREATE TABLE device2(
VALUE NVARCHAR(50)
)
GO
ID=1 和 ID=2 的插入
GO
INSERT INTO TestTable(Name,Value)
VALUES('Test1','test1'),('TEST2','test2')
首先,要为每一行查找新值,您可以使用“插入”,但它可以包含未更改的数据。 例如:ID =1,Name='test1' and VALUE='test1' name 列的更新也会包含在 inserted 中。
其次,要查找每一行的旧值,您可以使用“已删除”。
之后,我们找到仅包含 VALUE 更新的值。
总结一下,查找插入的行和删除的行将为我们提供每行新值和旧值的结果。 我们使用交集 (INNER JOIN) 来查找仅更改的值。
CREATE TRIGGER [dbo].[insertIntoDevices]
ON [dbo].[TestTable]
AFTER UPDATE
AS
BEGIN
DECLARE @InsertedTable table (
InsertedID INT,
InsertedName VARCHAR(5),
InsertedVALUE NVARCHAR(50)
)
DECLARE @DeletedTable table (
DeletedID INT,
DeletedName VARCHAR(5),
DeletedVALUE NVARCHAR(50)
)
INSERT INTO @InsertedTable(InsertedID,InsertedName,InsertedVALUE)
SELECT ID,[Name],[Value] FROM inserted;
INSERT INTO @DeletedTable(DeletedID,DeletedName,DeletedVALUE)
SELECT ID,Name,Value FROM deleted;
INSERT INTO device1(VALUE)
SELECT UpdatedValue = it.InsertedVALUE
FROM @InsertedTable as it
INNER JOIN @DeletedTable as dt ON it.InsertedID = dt.DeletedID AND ISNULL(dt.DeletedVALUE,'') <> ISNULL(it.InsertedVALUE,'')
WHERE it.InsertedID = 1
INSERT INTO device2(VALUE)
SELECT UpdatedValue = it.InsertedVALUE
FROM @InsertedTable as it
INNER JOIN @DeletedTable as dt ON it.InsertedID = dt.DeletedID AND ISNULL(dt.DeletedVALUE,'') <> ISNULL(it.InsertedVALUE,'')
WHERE it.InsertedID = 2
END
为了测试我在下面使用了更新查询;
--Example 1
UPDATE TestTable
SET Value='selam'
WHERE ID = 1
--Example 2
UPDATE TestTable
SET Value='hi'
WHERE ID = 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.