alter trigger时关键字“AS”附近的语法不正确

时间:2017-03-04 18:38:20

标签: sql-server sql-server-2012 database-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'.

有人可以指出我如何找到错误的方向

感谢。

1 个答案:

答案 0 :(得分:1)

不,不,不,不,不。

不要假设inserteddeleted只有一行。您只是在代码中添加错误,这些错误将在意外时间弹出。我实际上希望SQL Server在创建触发器时标记此用法。

相反:

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()功能。但这不是正确的解决方案。使用日期/时间时,请使用convert()format()以及所需的格式。

其他建议:

  • 执行insert时始终包含列名称。实际上,审计表确实应该有一个标识ID列,createdBycreatedAt列,所有列都有默认值。
  • 查看将要生成的字符串并确保它们是可读的。
  • 使用分号结束语句。
  • 不要依赖日期/时间值的默认格式。