Sql而不是insert trigger - 如果不存在则插入数据

时间:2010-12-03 10:44:47

标签: sql triggers left-join

我在一个表上有以下触发器,它重定向数据并包含基于LEFT OUTER JOIN的其他两个表中的数据。

如果BBOwnerMap中不存在i.ndl_DeviceID,则该列将为null,这很好。

我想要做的是,如果BBOwnerMap中不存在i.ndl_DeviceID,那么我想将其插入到那里并返回生成的自动编号BBOwnerMap.OwnerID

触发器如下: -

ALTER TRIGGER [dbo].[Redirect] 
   ON  [dbo].[ndl_dump] 
   instead of insert
AS 

BEGIN

INSERT INTO ndl_data
(ndl_Image,ndl_Text,ndl_Lat,ndl_Lng,ndl_CategoryID,ownerID)

SELECT i.ndl_Image,
       i.ndl_Text,
       i.ndl_Lat,
       i.ndl_Lng,
       ndl_config.ndl_CategoryID,
       BBOwnerMap.OwnerID

FROM   inserted i
       LEFT OUTER JOIN
       ndl_config
       ON i.ndl_Category = ndl_config.ndl_CategoryName
       LEFT OUTER JOIN
       BBOwnerMap
       ON i.ndl_DeviceID = BBOwnerMap.DeviceID
END

BBOwnerMap表是这样的: -

[dbo].[BBOwnerMap](
    [OwnerID] [int] IDENTITY(1,1) NOT NULL,
    [DeviceID] [varchar](50) NOT NULL,
    [DeviceNumber] [varchar](50) NOT NULL,
 CONSTRAINT [PK_BBOwnerMap] PRIMARY KEY CLUSTERED 

非常感谢任何有关如何修改此内容的帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

您应该只需在触发器顶部添加另一个insert语句即可。永远记住插入的表可以有多行,所以你要处理集合,而不是行。代码假定SQL Server。我喜欢找不到匹配项的LEFT JOIN,但你可以用NOT EXISTS where子句做同样的事情:

Insert into bbownermap (deviceid, devicenumber)
Select i.ndl_DeviceID, <deviceNum>
From inserted i
  Left join bbownermap b on i.deviceid=b.deviceid
Where b.ownerid is Null