2010-12-03 1 views
3

J'ai le déclencheur suivant sur une table qui redirige les données et inclut les données de deux autres tables basées sur une jointure gauche.Sql au lieu du déclencheur d'insertion - insertion de données si n'existe pas

Si i.ndl_DeviceID n'existe pas dans BBOwnerMap, cette colonne sera nulle ce qui est correct.

Ce que je veux faire est, si i.ndl_DeviceID n'existe pas dans BBOwnerMap alors je veux insérer dans là et retourner le autonumber résultant BBOwnerMap.OwnerID

Trigger est la suivante: -

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 

Table BBOwnerMap est comme ceci: -

[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 

Toute aide sur la façon de modifier ce serait très apprécié.

Merci.

Répondre

2

Vous devriez pouvoir ajouter simplement une autre instruction d'insertion en haut de votre déclencheur. Rappelez-vous toujours que la table insérée peut avoir plus d'une rangée, donc vous avez affaire à des ensembles, pas à des rangées. Le code suppose SQL Server. J'aime les JOINs qui ne trouvent pas de correspondances, mais vous pouvez faire la même chose avec une clause NOT EXISTS où:

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 
Questions connexes