2017-07-19 125 views
0

我想插入一个新的行与我的触发器到我的新表后插入一行到我原来的表,但我希望基于行的详细信息/列值添加一个名称到此ID。插入触发器创建后

我使用的情况下,/然后/时命令:

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 [email protected]@identity) 

它失败....

+0

待办事项你的意思是按照日期放置在CTE中选择最上面的1行命令,并在cte上运行case select?也许。 –

回答

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 
+0

插入新行插入源表后,插入由系统自动创建的临时表的名称? –

+0

是的,它只存在于触发器内。 –

+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