我是SQL的初学者。我使用Microsoft SQL Server和数据库从另一个系统(其他PC上的不同软件)传送批量数据。
我想为刚刚插入的行更新一列。我创建了一个触发器来更新插入的行,但是此触发器不更新任何内容。它可以更新任何其他表,但是对刚刚插入行的同一表进行更新是行不通的。
如果我直接在SSMS中插入数据,那么它可以工作-插入行的同一表在插入后进行更新。但是从其他系统/服务器插入的数据不会更新。实际上,甚至没有插入数据。不知道为什么。
我在寻找任何解决方案,发现MySQL无法更新用于读取/写入的同一表。我不知道相同的逻辑对SQL Server是否有效-但是为什么手动插入有效呢?
这是我的触发器:
ALTER trigger [cw].[mytrigger]
ON [cw].[TABLE1]
AFTER INSERT
AS
BEGIN
DECLARE @FBN nvarchar(10)
DECLARE db_cursor CURSOR FOR
SELECT FEEDBNO FROM inserted
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @FBN
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE cw.TABLE1
SET WCGroup = CASE
WHEN WCGroup = 'GROUP1' THEN 'GROUP_11'
WHEN WCGroup = 'GROUP2' THEN 'GROUP_22.'
WHERE FeedbackNo = @FBN
FETCH NEXT FROM db_cursor INTO @FBN
END
CLOSE db_cursor
DEALLOCATE db_cursor
END
感谢您的帮助或解决方案。谢谢。
更新: 好,解决了另一种方法。问题很可能是源系统上的ETL作业运行。我在目标表中创建了一个新列,并根据插入的数据触发将所需的值插入到此列中。通过触发器更新ETL中使用的列无法正常工作。 谢谢答案,我学到了一些新东西。
答案 0 :(得分:1)
您的触发器存在一些缺陷。首先,游标不是一个好主意,因此我们应该摆脱它。照原样处理您的数据;数据集。接下来,您的CASE
缺少END
,因此您应该遇到语法错误。我相信这可以解决问题(您需要将YourIDColumn
更正为适当的列名):
ALTER TRIGGER cw.mytrigger ON cw.Table1
AFTER INSERT
AS BEGIN
UPDATE T1
SET WCGroup = CASE i.WCGroup WHEN 'GROUP1' THEN 'GROUP_11'
WHEN 'GROUP2' THEN 'GROUP_22.'
ELSE i.WCGroup END
FROM cw.table1 T1
JOIN inserted i ON T1.YourIDColumn = i.YourIDColumn;
END;