插入触发器创建后

时间:2017-07-19 13:23:36

标签: sql sql-server tsql triggers

我想在我的新表中插入一行后,将一个带触发器的新行插入到我的新表中,但我希望根据行详细信息/列值为此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)

失败了......

2 个答案:

答案 0 :(得分:2)

您需要从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

答案 1 :(得分:1)

就像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