更改触发器时关键字“AS”附近的语法不正确

Incorrect syntax near the keyword “AS” when alter trigger

我创建了名为 trgInsteadofdeleteEmp 的触发器 我只是想改变它,我写了以下 SQL 代码

alter trigger trgInsteadofdeleteEmp on Emp
instead of delete
as
begin
    declare @id int , @name nvarchar(100)
    select @id =id from deleted
    select @name = name from deleted
    insert into EmployeeAudit values (@id ,@name + 'tried to delete at' + GETDATE() as varchar(50))
end

并有以下输出:

Msg 156, Level 15, State 1, Procedure trgInsteadofdeleteEmp, Line 8 Incorrect syntax near the keyword 'as'.

谁能指出我如何找到错误的方向

谢谢。

不不不不不不

不要错误地认为 inserteddeleted 只有一行。您只是在您的代码中放置了会在意想不到的时间弹出的错误。我实际上希望 SQL 服务器在创建触发器时标记此用法。

改为:

alter trigger trgInsteadofdeleteEmp on Emp
    instead of delete
as
begin
    insert into EmployeeAudit(id, name)
        select id,
               name + ' tried to delete at ' + convert(varchar(255), GETDATE(), 121) )
        from deleted d;
end;

您的错误是由 as 引起的。似乎缺少 cast() 功能。但这不是正确的解决方法。对于 date/times,使用 convert()format() 以及所需的格式。

其他建议:

  • 在执行 insert 时始终包含列名。事实上,审计 table 确实应该有一个身份 ID 列、createdBycreatedAt 列,它们都具有默认值。
  • 查看将生成的字符串并确保它们可读。
  • 使用分号结束语句。
  • 不要依赖 date/time 值的默认格式。