【问题标题】:How to Use FIRE_TRIGGERS in insert sql statement如何在插入 sql 语句中使用 FIRE_TRIGGERS
【发布时间】:2010-11-17 07:04:36
【问题描述】:

我正在尝试将数据从表“tb_A”复制到自身(使用不同的主键)。

当“tb_A”表插入新记录时,我编写了一个触发器来用一条记录填充另一个表“tb_B”。

我运行了以下语句。

INSERT INTO [tb_A]
       ([NAME])
 select top (20)[NAME] from [tb_A] 

我预计“tb_B”中有 20 条新记录。但我没有。

无论如何,我看到 FIRE_TRIGGERS 在批量插入期间使用来克服这个问题。 是否有任何方法可以在插入语句中使用它?请举个例子。

盖恩


触发代码(从 Gayan 的评论复制到 gbn 的答案):

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT
AS
    DECLARE @AID as int
    SELECT @AID = [ID] FROM inserted

    INSERT INTO [tb_B]([IDA]) VALUES (@AID)

【问题讨论】:

    标签: sql sql-server tsql triggers


    【解决方案1】:

    您的触发器无法正常工作的原因是它设计不当。即使您插入一百万条记录,每次插入也会触发一次触发器。您有一个触发器,它假设它会一次处理一条记录。每当您将插入或删除的值形式设置为标量变量时,触发器都是错误的,需要重写。试试这样吧。

    CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT 
    AS 
    
        INSERT INTO [tb_B]([IDA])
        SELECT  [ID] FROM inserted 
    

    【讨论】:

      【解决方案2】:

      FIRE_TRIGGERS 仅适用于 BULK INSERT(和 bcp),而非“标准”INSERT

      我希望你的触发器看起来像

      CREATE TRIGGER TRG_tbA_I ON tb_A FOR INSERT
      AS
      SET NOCOUNT ON
      
      INSERT tb_B (col1, col2, ...)
      SELECT col1, col2, ... FROM INSERTED
      GO
      

      您使用特殊的 INSERTED 表来获取 tb_A 中的新行列表,然后将其插入到 tb_B 中。这适用于不止一行

      如果您添加触发代码,那么我们可以解释问题所在。

      编辑:您的触发器只会从 INSERTED 读取单行(任何行,无特定顺序)。它不像我的粗略示例那样基于设置。

      【讨论】:

      • 创建触发器 UpdatetbB ON [dbo].[tb_A] FOR INSERT AS DECLARE @AID as int SELECT @AID = [ID] FROM inserted INSERT INTO [tb_B]([IDA]) 值 (@AID ) 这是我用来执行此任务的触发器
      • 创建触发器 UpdatetbB ON [dbo].[tb_A] FOR INSERT AS DECLARE @AID as int SELECT @AID = [ID] FROM inserted INSERT INTO [tb_B]([IDA]) 值 (@AID )
      • 你需要一个类似 gbn 的触发器。只有当插入的伪表有一行时,你的才会起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多