触发引发错误函数语法不正确

时间:2014-09-17 10:33:10

标签: sql triggers

我有触发器&内部代码是:

declare    
    @errno int,
    @errmsg varchar(255),

if exists (select 1
           from audit t2, inserted i1, deleted d1
           where t2.user_id = d1.cpi_id
             and (i1.cpi_id != d1.cpi_id))
begin
    select 
        @errno = 30005,
        @errmsg = 'Children still exist in "audit". Cannot modify parent code in "cpi_user".'
       goto error
end

/*  Errors handling  */
error:
    raiserror @errno @errmsg
    rollback  transaction

当我执行此操作时,我收到此错误

  

' @ errno'

附近的语法不正确

奇怪的是,相同的代码在之前和之前都在工作。突然间它出现了错误。

你能让我知道我做错了什么吗?

3 个答案:

答案 0 :(得分:0)

因为@errno可以是varchar而且引号不在30005周围。

请尝试查看:

 select @errno  = '30005',
              @errmsg = 'Children still exist in "audit". Cannot modify parent code in "cpi_user".'

编辑1:

可能是因为之后的额外逗号:

@errmsg varchar(255),

虽然声明。

不需要那个逗号。

编辑2:

你写过:

Declare @errno int,
@errmsg varchar(255),
................

请将其写为:

Declare @errno int
Declare @errmsg varchar(255)

答案 1 :(得分:0)

Raiserror的

语法:

RAISERROR ( { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

https://msdn.microsoft.com/en-us/library/ms178592.aspx

在你的情况下:

raiserror (30005,
           1, --Severety 
           10, --State
   'Children still exist in "audit". Cannot modify parent code in "cpi_user".')

答案 2 :(得分:0)

您拼写错误。

不是RAISEERROR,而是RAISERROR。

否则,您将得到:

Incorrect syntax near 'RAISEERROR'

您还需要3个参数。

这里是一个例子:

CREATE PROCEDURE LogError
    AS
    BEGIN
        SET NOCOUNT ON;

        INSERT INTO dbo.DB_Errors
        VALUES (
            SUSER_SNAME()
            ,ERROR_NUMBER()
            ,ERROR_STATE()
            ,ERROR_SEVERITY()
            ,ERROR_LINE()
            ,ERROR_PROCEDURE()
            ,ERROR_MESSAGE()
            ,GETDATE()
            );

        DECLARE @Message VARCHAR(MAX) = ERROR_MESSAGE()
            ,@Severity INT = ERROR_SEVERITY()
            ,@State SMALLINT = ERROR_STATE() 

        RAISERROR(@Message, @Severity, @State)
    END
    GO