2014-01-22 13 views
9

Ich erstelle Trigger für mehrere Tabellen. Die Trigger haben dieselbe Logik. Ich möchte eine gemeinsame gespeicherte Prozedur verwenden. Aber ich weiß nicht, wie die Arbeit mit eingefügt und gelöscht Tabelle.Wie verwenden Sie eingefügte gelöschte Tabelle in der gespeicherten Prozedur?

Beispiel:

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 
+2

Sie können nicht. Die Pseudotabellen sind nur direkt in Triggern verfügbar. Und dein Code ist kaputt. 'inserted' kann 0, 1 oder mehrere Zeilen enthalten -' SET @FiledId = (SELECT FiledId FROM eingefügt) 'wählt einen Wert aus * one * dieser Zeilen und ignoriert die anderen –

Antwort

8

Sie können table valued parameter verwenden, um die eingefügten/gelöschten Werte von Triggern zu speichern und an den proc weiterzuleiten. zB wenn alles, was Sie in Ihrem proc brauchen, ist die UNIQUE FileID's:

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 

Und dann passieren die eingefügt/gelöscht ids vom Abzug, zB:

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; 
+0

es ist gut, aber viel Arbeit ... – Mediator

+0

Sobald Sie den Typ und proc an Ort und Stelle haben, seine 3 LOC pro Trigger, die Sie sagen, Sie haben bereits? – StuartLC

+2

Meine 2 Cent: Achten Sie darauf, dass Trigger schwer zu debuggen sind und zu viel Logik in ihnen steckt, um Sie in Schwierigkeiten zu bringen. – SAS

0

Die Tabellen eingefügt und gelöscht sind nur innerhalb des Trigger zur Verfügung. Sie können sie nur in der Laufzeit verwenden. Sie enthalten dann die betroffenen Zeilen.

Auch funktioniert Ihr Code möglicherweise nicht wie erwartet, wenn nicht genau eine Zeile eingefügt wird.

+0

Vielleicht kann ich die Tabelle in einem Parameter übergeben ? – Mediator

+0

Entschuldigung, nicht zu einem Auslöser. Aber vielleicht verwenden Sie dynamisch sql, um zu tun, was Sie wollen. – SAS

3

Sie können

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

und dann

Verwenden Sie diese zwei temporäre Tabellen in Ihrem gespeicherten proc

Verwandte Themen