Sql вместо триггера вставки - вставьте данные, если не существует - PullRequest
3 голосов
/ 03 декабря 2010

У меня есть следующий триггер для таблицы, которая перенаправляет данные и включает в себя данные из двух других таблиц на основе LEFT OUTER JOIN.

Если i.ndl_DeviceID не существует в BBOwnerMap, тогда этот столбец будет нулевым, что нормально.

Что я хочу сделать, если i.ndl_DeviceID не существует в BBOwnerMap, то я хочу вставить его туда и вернуть полученный автономный номер BBOwnerMap.

Триггер выглядит следующим образом: -

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 голосов
/ 03 декабря 2010

Вы можете просто добавить еще один оператор вставки в верхней части вашего триггера.Всегда помните, что во вставленной таблице может быть несколько строк, поэтому вы имеете дело с наборами, а не со строками.Код предполагает SQL Server.Мне нравятся ЛЕВЫЕ СОЕДИНЕНИЯ, которые не находят совпадений, но вы можете сделать то же самое с предложением 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
...