Comment utiliser insert \ deleted table dans la procédure stockée?

Je crée des sortingggers pour plusieurs tables. Les triggersurs ont la même logique. Je vais vouloir utiliser une procédure stockée commune. Mais je ne sais pas comment travailler avec la table insérée et effacée .

Exemple:

SET @FiledId = (SELECT FiledId FROM inserted) begin tran update table with (serializable) set DateVersion = GETDATE() where FiledId = @FiledId if @@rowcount = 0 begin insert table (FiledId) values (@FiledId) end commit tran 

Vous pouvez utiliser un paramètre table value pour stocker les valeurs insérées / supprimées des sortingggers et les transmettre à proc. Par exemple, si tout ce dont vous avez besoin dans votre proc est le FileID's UNIQUE:

 CREATE TYPE FileIds AS TABLE ( FileId INT ); -- Create the proc to use the type as a TVP CREATE PROC commonProc(@FileIds AS FileIds READONLY) AS BEGIN UPDATE at SET at.DateVersion = CURRENT_TIMESTAMP FROM ATable at JOIN @FileIds fi ON at.FileID = fi.FileID; END 

Et puis passez les identifiants insérés / supprimés du triggersur, par exemple:

 CREATE TRIGGER MyTrigger ON SomeTable FOR INSERT AS BEGIN DECLARE @FileIds FileIDs; INSERT INTO @FileIds(FileID) SELECT DISTINCT FileID FROM INSERTED; EXEC commonProc @FileIds; END; 

Vous pouvez

 select * into #Inserted from inserted select * into #Deleted from deleted 

et alors

utiliser ces deux tables temporaires dans votre proc stocké

Les tables insérées et supprimées ne sont disponibles qu'à l'intérieur du triggersur. Vous ne pouvez les utiliser qu'en cours d'exécution. Ils contiendront alors les lignes affectées.

En outre, votre code peut ne pas fonctionner comme prévu s'il n'y a pas exactement une ligne insérée.