SQL Server:插入后更新同一表

时间:2019-03-02 16:41:11

标签: sql-server

我是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中使用的列无法正常工作。 谢谢答案,我学到了一些新东西。

1 个答案:

答案 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;