我有触发器&内部代码是:
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'
附近的语法不正确
奇怪的是,相同的代码在之前和之前都在工作。突然间它出现了错误。
你能让我知道我做错了什么吗?
答案 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 ( { 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