【发布时间】:2019-03-02 16:41:11
【问题描述】:
我是 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 中使用的更新列无法正常工作。 感谢您的回答,我学到了一些新东西。
【问题讨论】:
-
您不需要光标。您可以通过在表的主键上加入
inserted,将更新作为基于集合的操作来执行。我会发布示例代码,但您的问题中没有包含CREATE TABLEDDL。 -
您确定您了解提交事务处理来自其他系统的内容的方式吗?在我看来,这可能会有所不同。
标签: sql-server