SQL:消息156,级别15,状态1,过程UA_TRIGGER_PAGAMENTO,第15行关键字'THEN'附近的语法不正确

时间:2017-01-19 10:54:22

标签: sql-server triggers syntax-error

我正在尝试创建一个简单的触发器,并使用SQL Server Management Studio提供的模板。我已经进行了广泛的搜索,但找不到解决方案。我为一些葡萄牙语文本道歉,但数据库是用同一种语言。

CREATE TRIGGER dbo.UA_TRIGGER_PAGAMENTO
ON dbo.PagamentoSet
AFTER UPDATE
AS
    DECLARE @vEstado VARCHAR(20);
    DECLARE @vIdSocio INT;
BEGIN
    SET NOCOUNT ON; 

    SET @vEstado = (SELECT Estado FROM inserted);
    SET @vIdSocio = (SELECT Socio_Id FROM inserted);

    IF (@vEstado = 'PAGO') THEN
        UPDATE SocioSet
        SET Atualizado = 'True'
        WHERE Id = @vIdSocio;   
    END IF;
END
GO

当我尝试运行它时,我收到以下错误:

  

Msg 156,Level 15,State 1,Procedure UA_TRIGGER_PAGAMENTO,Line 15   关键字'THEN'附近的语法不正确。

     

Msg 156,Level 15,State 1,Procedure UA_TRIGGER_PAGAMENTO,Line 23
  关键字“END”附近的语法不正确。

我已经尝试在de BEGIN - END中声明变量。试着不要用分号。没别的了。

谢谢

2 个答案:

答案 0 :(得分:0)

注意:sql server中的触发器是按语句触发的,而不是每行触发的。这意味着您插入的表可能包含多个值。在这种情况下,您当前的触发器将引发错误(子查询返回的值超过一个值)。

以下是编写触发器的正确​​方法:

CREATE TRIGGER dbo.UA_TRIGGER_PAGAMENTO
ON dbo.PagamentoSet
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON; 

        UPDATE t 
        Set Atualizado = 'True'
        FROM SocioSet t 
        INNER JOIN inserted i ON t.Id = i.Socio_Id
        WHERE t.Estado = 'PAGO';

END
GO

另外,为了将来参考,在sql中编写if ... else条件的正确方法是

IF condition
BEGIN
    -- statements
END
[ELSE
BEGIN
   -- statements
END]

答案 1 :(得分:0)

我已经找到了解决方案。删除'THEN'和'END IF'。 https://msdn.microsoft.com/en-us/library/ms182717.aspx