我创建了一个名为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'.
有人可以指出我如何找到错误的方向
感谢。
答案 0 :(得分:1)
不,不,不,不,不。
不要假设inserted
和deleted
只有一行。您只是在代码中添加错误,这些错误将在意外时间弹出。我实际上希望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列,createdBy
和createdAt
列,所有列都有默认值。