2016-06-29 11 views
0

Ich versuche, einen Trigger in SQL Server 2008 R2 für Überwachungszwecke zu erstellen. Um die richtige Zeitzone für verschiedene Standorte im ganzen Land zu bekommen, versuche ich eine Variable an eine IF/ELSE IF-Anweisung zu übergeben, um die Stunden mit der Funktion DATEADD() zu ändern. Hier ist mein Code:Erwartete Conversation Fehler Sql Server

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 
DECLARE @facilityCode INT 

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
IF @facilityCode = 403 --for logan 
    BEGIN 
     SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
      Created_On = DATEADD(HH,-1,GETDATE() 
    END 
    ELSE IF @facilityCode = 203 -- for Thermont 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = DATEADD(HH,1,GETDATE()) 
     END 
    ELSE IF @facilityCode = 263 --for Saint Charles 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = GETDATE() 
     END 
END 
END 

Ich bekomme alle Arten von Fehlern, die alle sagen, erwarten, CONVERSATION. Ich bin mir nicht sicher, was das bedeutet. Ich habe es gegoogelt und das hat die Verwirrung noch verstärkt.

+0

Was ist der Fehler, den Sie erhalten und an welchem ​​Teil der Abfrage? –

+0

Alle IF- und ELSE-IF-Anweisungen geben mir die EXPECTING CONVERSATION-Fehler. – bryanfm92

Antwort

0

Zuerst müssen Sie beim Schreiben eines Triggers daran denken, dass mehr als 1 Datensatz gleichzeitig eingefügt, aktualisiert oder gelöscht wird!

Ich gehe davon aus, SQL-Server auf Ihren Code schauen, aber wenn eine andere RDBMS bitte beachten Sie es.

Weiter

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 

Ist immer gehen Sie die Möglichkeit, Code geben, die bereits in epic_cover ist, die nicht das, was Sie wollen.

Dann versuchen Sie zu mischen und IF-Anweisung mit einer Update-Anweisung, die nicht erlaubt ist. Aber die Realität ist, dass Sie keine der if und Sie können einfach eine Case-Anweisung verwenden.

Dann aktualisieren Sie alle Datensätze in der Tabelle und nicht nur diejenigen, die eingefügt wurden. Sie benötigen einen Primärschlüssel in der Tabelle, wenn Sie nicht über eine Möglichkeit verfügen, herauszufinden, welche Datensätze hinzugefügt wurden! Dann nutzen Sie die spezielle Tabelle "inserted".

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
    SET Created_By = CASE WHEN i.Created_By IS NULL THEN SUSER_NAME() 
        WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
        ELSE i.Created_By END 
     ,Created_On = CASE 
     -- right function is for strings so I assume order num is a string if not you will need to do some casting 
      WHEN RIGHT(i.order_num, 3) = '403' THEN DATEADD(HH,-1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '203' THEN DATEADD(HH,1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '263' THEN GETDATE() 
      ELSE NULL-- ????? 
     END 
FROM 
    epic_cover e 
    INNER JOIN inserted i 
    ON e.PrimaryKey = i.PrimaryKey 

END 
+0

Das macht so viel mehr Sinn. Ich habe komplett vergessen, den Einsatztisch zu verwenden. Vielen Dank – bryanfm92

+0

cool froh, dass es helfen wird, Trigger sind nicht die einfachste Sache in der Welt, durch Logik zu denken! Und es gibt Leistungseinbußen für sie .... Wie auch immer, ich habe die Variable aktualisiert und aus meinem Code entfernt, weil Sie sie nicht brauchen. Wenn es für Sie funktioniert, akzeptieren Sie die Antwort. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work danke – Matt

+0

Akzeptiert Ihre Antwort. Es hat mir nicht nur heute geholfen, sondern auch viel beigebracht. Ich kann dir nicht genug danken. – bryanfm92