【问题标题】:After Insert trigger creation插入触发器创建后
【发布时间】:2017-07-19 13:23:35
【问题描述】:

在我的原始表中插入一行后,我想用我的触发器在我的新表中插入一个新行,但我希望根据行详细信息/列值向此 ID 添加一个名称。

我正在使用 case/then/when 命令:

USE [DB1]
GO
/****** Object:  Trigger [dbo].[Trigger1]    Script Date: 19/07/2017 15:16:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger1]
ON [SourceTable]
AFTER INSERT 
AS  

insert into [dbo].[DestinationTable] ([ID],[NAME]) (select id, name = CASE
                  WHEN XXXX THEN '*****'
                  WHEN XXXX THEN '*****'
                  WHEN XXXX THEN '*****'
                  WHEN XXXX THEN '*****'
                  WHEN XXXX THEN '*****'
                  WHEN XXXX THEN '*****'
                  END
FROM SourceTable WITH (NOLOCK) WHERE ID=@@identity)

失败了……

【问题讨论】:

  • 您的意思是按日期选择前 1 行顺序放入 CTE 并在 cte 上运行案例选择?也许吧。

标签: sql sql-server tsql triggers


【解决方案1】:

您需要从Inserted 伪表中进行选择,该伪表包括使用触发此触发器的操作插入的所有行(它也可以是多行!):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[Trigger1]
ON [SourceTable]
AFTER INSERT 
AS  
    INSERT INTO [dbo].[DestinationTable] ([ID], [NAME]) 
        SELECT
            i.ID,
            CASE
               WHEN XXXX THEN '*****'
               WHEN XXXX THEN '*****'
               WHEN XXXX THEN '*****'
            END
        FROM  
            Inserted i

【讨论】:

    【解决方案2】:

    就像marc_s 在评论中所说,您只需从Inserted 表中进行选择。它包含在 SourceTable 中插入的所有新行。

    ALTER TRIGGER [dbo].[Trigger1]
    ON [SourceTable]
    AFTER INSERT 
    AS 
    BEGIN
    
      insert into [dbo].[DestinationTable] ([ID],[NAME]) 
      select id, name = CASE
                      WHEN XXXX THEN '*****'
                      WHEN XXXX THEN '*****'
                      WHEN XXXX THEN '*****'
                      WHEN XXXX THEN '*****'
                      WHEN XXXX THEN '*****'
                      WHEN XXXX THEN '*****'
                      END
      FROM inserted
    
    END
    

    【讨论】:

    • IS在源表中插入新行后系统自动创建的临时表的名称?
    • 是的,它只存在于触发器内部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多