我在SQL Server中有一个表,有3列:ID
,NAME
,VALUE
。
这个表有2行ID=1
和ID=2
。
(ID的值不变)。
每隔一段时间VALUE
列的值都会发生变化。每次列VALUE
发生变化时,我都想将这个更新后的值插入到表中(Device1 for ID=1, Device1 for ID=2)。
我创建了一个更新触发器,就像update(VALUE) begin…但是它不起作用。
是否有一种方法可以在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的每次更新都会在device1和device1中插入VALUE,并且会重复我的表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')
首先,要找到每一行的新值,您可以使用'insert ',但它可以包括未更改的数据。例如:ID =1,Name='test1'和VALUE='test1',并且Name列的更新也将包含在插入中。
其次,要查找每一行的旧值,您可以使用'deleted'。
之后,我们找到了只包含VALUE更新的值。
To Sump Up,查找插入行和删除行将为我们提供每一行的新值和旧值的结果。我们使用交集(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