Rea*_*ces 2 trigger sql-server-2005 syntax sql-server-2012
我最近从 SQL Server 2005 升级到 2012。但是在验证过程中,发现了一个错误。
某个触发器的编码如下:
CREATE TRIGGER [dbo].[trigger] on [dbo].[foo]
FOR UPDATE, UPDATE
AS
UPDATE foobar
SET datetime = GetDate()
FROM bar
WHERE foobar.id = bar.id
GO
Run Code Online (Sandbox Code Playgroud)
我可以在 SQL Server 2005 上安全地执行这个(奇怪的)。
但是,在 SQL Server 2012 上,它会引发(我所期望的)语法错误。
语法错误:触发器声明中操作“UPDATE”的重复规范。
为什么这不会在 SQL Server 2005 上引发语法错误?我在这方面的 google-fu 失败了。
为什么这似乎适用于 SQL Server 2005?
约翰是对的,您收到的更新语法错误消息是:
消息 1034,级别 15,状态 1,过程触发器
语法错误:触发器声明中操作“UPDATE”的重复规范。
这绝对是因为触发器被指定为FOR UPDATE, UPDATE. 这种语法在较旧的兼容级别中是允许的,但在现代兼容级别中不允许。
事实上,我已经对此进行了测试,该语法在 80 兼容模式(SQL Server 2000)中是允许的,但在 90+ 中不允许。我已经更新了关于 compat level 80 的规范答案。
(至于为什么它不是一个记录在案的重大更改,好吧,耸耸肩。如果您想要一个有意义的答案,您需要直接与 Microsoft 联系。)
至于触发器本身,我会这样写:
UPDATE t
SET t.datetime = GETDATE()
FROM dbo.table1 AS t
INNER JOIN dbo.table2 AS t2
ON t.id = t.id;
Run Code Online (Sandbox Code Playgroud)
语法错误可能是对单词的更严格的解析table,不确定。如果这确实是您的表的名称,您应该更改它,或者[put it in square brackets].
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |