2017-04-13 241 views
0

我試圖轉換SQL Server中的db2觸發器。我已經改變了一些東西,像NEWDOC和OLDDOC引用,並刪除了「THEN」關鍵字。SQL Server創建觸發器:關鍵字'IF'附近的語法不正確

我仍然得到這個錯誤:

Incorrect syntax near ';'. 
Incorrect syntax near the keyword 'IF'. 

的SQL是:

-- <ScriptOptions statementTerminator="!" /> 
CREATE TRIGGER DOCUMENTS_UPDATE ON DOCUMENTS_VIEW 
INSTEAD OF UPDATE 
AS 
BEGIN 
    IF (select user_id from inserted) is null 
    UPDATE DOCUMENTS 
    SET id = (select id from inserted), 
      user_id = (SELECT id from users 
         where username = (select username from inserted) 
        ), 
      code = (select code from inserted), 
      description = (select description from inserted), 
      type = (select type from inserted), 
      expiry = (select expiry from inserted), 
      parent_code = (select parent_code from inserted), 
      attributes = (select attributes from inserted), 
      acquired = (select acquired from inserted) 
    WHERE id = (select id from inserted); 
    ELSE 
    UPDATE DOCUMENTS 
    SET id = (select id from inserted), 
      user_id = (select user_id from inserted), 
      code = (select code from inserted), 
      description = (select description from inserted), 
      type = (select type from inserted), 
      expiry = (select expiry from inserted), 
      parent_code = (select parent_code from inserted), 
      attributes = (select attributes from inserted), 
      acquired = (select acquired from inserted) 
    WHERE id = (select id from inserted); 
    END IF; 

    UPDATE DOCUMENT_STATES 
    SET document_id = (select id from inserted), 
     state = (select state from inserted), 
     date = (select date from inserted), 
     timestamp = (select timestamp from inserted) 
    WHERE document_id = (select id from inserted); 

    IF NEWDOC.type = 'client_order' 
    UPDATE DOCUMENTS 
    SET parent_code = (select code from inserted) 
    WHERE code = (select parent_code from inserted); 
END IF; 
END! 

回答

0

你的語法問題很容易解決。正如GandRalph所指出的那樣,SQL Server中沒有END IF

更重要的是,您沒有正確使用inserted。它可以包含多個行 - 受DML語句影響的所有行。當發生這種情況時,您的查詢將會出錯並出現錯誤。

第一個if可以替換爲單個update。它看起來像這樣:

update d 
    set user_id = coalesce(u.id, i.userid), 
     code = i.code, 
     description = i.description, 
     type = i.type, 
     expiry = i.expiry, 
     parent_code = i.parent_code, 
     attributes = i.attributes, 
     acquired = i.acquired 
    from documents d join 
     inserted i 
     on d.id = i.id left join 
     users u 
     on u.username = i.username 
2

沒有END IF在TSQL。格式應該是:

IF <condition> 
Begin 
--Do something 
End 
Else 
Begin 
--Do something 
End 
0
CREATE TRIGGER 
DOCUMENTS_UPDATE ON DOCUMENTS_VIEW 
INSTEAD OF UPDATE 
AS 
BEGIN 
    IF (select user_id from inserted) is null 
     UPDATE DOCUMENTS SET id = (select id from inserted), user_id = (SELECT id 
     from users where username =(select username from inserted)), code = (select 
     code from inserted), description = (select description from inserted), type 
     = (select type from inserted), 
     expiry = (select expiry from inserted), parent_code = (select parent_code 
     from inserted), attributes=(select attributes from inserted), acquired= 
     (select acquired from inserted) WHERE id = (select id from inserted); 
    ELSE 
     UPDATE DOCUMENTS SET id = (select id from inserted), user_id = (select 
     user_id from inserted), code = (select code from inserted), description = 
     (select description from inserted), type = (select type from inserted), 
     expiry = (select expiry from inserted), parent_code = (select parent_code 
     from inserted), attributes=(select attributes from inserted), acquired= 
     (select acquired from inserted) WHERE id = (select id from inserted); 

    UPDATE DOCUMENT_STATES SET document_id =(select id from inserted), state = 
    (select state from inserted), date = (select date from inserted), timestamp 
    = (select timestamp from inserted) WHERE document_id = (select id from 
    inserted); 

    IF NEWDOC.type = 'client_order' 
     UPDATE DOCUMENTS SET parent_code = (select code from inserted) WHERE code = 
     (select parent_code from inserted); 

END 
相關問題