【问题标题】:SQL Server : update the same table after insertSQL Server:插入后更新同一个表
【发布时间】: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 TABLE DDL。
  • 您确定您了解提交事务处理来自其他系统的内容的方式吗?在我看来,这可能会有所不同。

标签: sql-server


【解决方案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;

【讨论】:

  • 感谢您的回答。我根据上面的代码修改了触发器,不幸的是问题仍然存在。如果启用触发器,则不会对传入数据执行插入或更新。管理工作室中的手动插入工作。对于传入的数据,使用源系统的ETL函数插入。
  • 考虑到触发只影响INSERT 语句,@ThePegas 问题出在您的 ETL。该触发器不会阻止 UPDATE 工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2015-08-18
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多