2017-04-13 240 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 
相关问题