2010-12-03 54 views
3

我有一个重定向数据并包含来自其他两个表基于左外部连接的数据的表上的以下触发器。Sql而不是插入触发器 - 插入数据如果不存在

如果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 

如何修改任何帮助,这将非常感激。

谢谢。

回答

2

您应该可以在触发器的顶部添加另一个插入语句。一定要记住插入的表可以有多行,所以你正在处理的是集合,而不是行。代码假定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