2017-07-19 89 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