使用SQL代替插入触发器 - 如果数据不存在,则插入数据

3

我在一张表上有一个触发器,基于左外连接,将数据重定向并包含来自另外两个表的数据。

如果 i.ndl_DeviceID 在 BBOwnerMap 中不存在,则该列将为空,这是可以接受的。

我想做的是,如果 i.ndl_DeviceID 在 BBOwnerMap 中不存在,那么我希望将它插入到其中,并返回结果的自动编号 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个回答

2

你只需要在触发器的顶部添加另一个插入语句即可。请记住,插入的表可能有多行,因此您正在处理集合而不是行。代码假设使用SQL Server。我喜欢使用不找到匹配项的LEFT JOINs,但您也可以使用NOT EXISTS子句执行同样的操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接