2016-07-22 8 views
-1

Ich versuche, einen Trigger mit dieser Logik zu schreiben:ändern Wert der eingefügten Zeile einer Spalte mit Trigger

Nach Einsatz, wenn eine bestimmte Spalte = ‚Fprice_bat‘, den Wert einer anderen Spalte ‚0000‘ ändern .

Was ich bis jetzt geschrieben habe, versucht einfach einen neuen Datensatz in die Tabelle einzufügen, anstatt die eingefügte Zeile zu aktualisieren.

Meine Abfrage sieht jetzt so aus.

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I] 
ON [dbo].[HEADER_BAT] 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE 
     @Starttime varchar(6),      
     @Endtime varchar(6),       
     @Batchstate varchar(30),      
     @Batchtype varchar(30)              

    SELECT 
     @Starttime = F908,       
     @Endtime = F910,        
     @Batchstate = F914,       
     @Batchtype = F916 
    FROM 
     inserted 

    IF @Batchtype = 'FSPRICE_BAT' 
    BEGIN 
     INSERT INTO HEADER_BAT (F908, F910, F914) 
     VALUES (0000, 2359, 'WAIT') 
    END 

Ich stelle mir vor, mein Fehler, weil ich „Einfügen in header_Bat“ ich anrufen und es sollte in eingefügt etwas entlang der Linien des Einsatzes sagen ... aber das Syntax ist nicht richtig.

Wie kann ich diese Abfrage die eingefügte Zeile bearbeiten, anstatt einen neuen Datensatz zur Tabelle hinzuzufügen?

+0

ändern Sie es zu einem 'before' Trigger. Sie können die Werte ändern, BEVOR sie in die Tabelle eingefügt werden. –

+1

Verwenden Sie einen 'INSTEAD OF' Trigger – Lamak

+0

' Wenn ein bestimmtes Feld = 'Fprice_bat' den Wert eines anderen Feldes zu '0000' ändern 'Einsätze ändern keine Werte, sie fügen einfach neue Datensätze, Ihre Frage macht nicht viel Sinn mir. Könnten Sie es bitte etwas deutlicher erklären? –

Antwort

2

Ihr erster Fehler besteht darin, nur einen einzelnen Zeileneinsatz anzunehmen. Alle DML-Operationen sind Operationen festgelegt. Also wenn du etwas aktualisieren willst, arbeite mit Sets.

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I] 
    ON [dbo].[HEADER_BAT] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    update HEADER_BAT 
     set F908='0000', F910=2359, F914='WAIT' 
    from HEADER_BAT h 
     inner join inserted i on h.id = i.id --or what is PK 
    where i.F916 = 'FSPRICE_BAT' 
END 
+0

Das sah aus wie es funktionierte. Ich bin mir ziemlich sicher, dass ich auch deiner Logik folge. Vielen Dank. – user1837575

1

ich nicht ganz Ihre Logik verstehen, aber ich glaube, Sie den Wert ändern wollte in F908 Spalte eingefügt werden, je nachdem, was in der F916 Säule geleitet wird.

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I] 
ON [dbo].[HEADER_BAT] 
INSTEAD OF INSERT 
AS 
BEGIN 
SET NOCOUNT ON; 

    INSERT INTO HEADER_BAT (F908, F910, F914) 
    SELECT 
     CASE WHEN F916 = 'FSPRICE_BAT' THEN '0000' ELSE F908 END 
     ,F910 -- Hardcode the value to 2359 or use from inserted 
     ,F914 -- Hardcode the value to 'WAIT' or use from inserted 
    FROM inserted 
END