【问题标题】:SQL Server 2016 Stored Procedure Syntax ErrorSQL Server 2016 存储过程语法错误
【发布时间】:2018-08-02 20:04:33
【问题描述】:

我最近将 SQL Server 2008 数据库恢复到 SQL Server 2016 实例。大部分功能似乎都可以正常工作,但我的许多存储过程(包括对名为 SYS_USER 的应用程序数据库表的更新)都失败并出现以下错误:

消息 102,级别 15,状态 1,过程 SYS_USERupdate,第 35 行 [批处理开始行 0]
'@errorNumber' 附近的语法不正确

数据库没有名为SYS_Userupdate 的存储过程,并且没有一个过程的代码包含术语@errorNumber。我尝试直接在 SQL Server Management Studio 中从失败的过程之一运行 SQL 查询,并收到相同的错误消息。这是失败的 SQL 查询:

UPDATE SYS_USER
SET SYS_USER_LGF_DT = GETDATE()
WHERE SYS_USER_ID = @SYS_USER_ID

我为@SYS_USER_ID 变量插入了一个有效值。与其他表相关的类似查询运行没有问题。所有存储过程都在 SQL Server 2008 实例上运行,没有错误。另外,将数据库compatibility_level 改为 100,这对于 SQL Server 2016 来说应该是可以接受的。

【问题讨论】:

  • 检查SYS_USER 表上的触发器。 (此外,无论来源如何,sp_helptext 'SYS_USERupdate' 都应该为您提供定义。)
  • @JeroenMostert 表上有触发器,之前不知道(继承了这个数据库)。我会修改这些,看看修改或禁用触发器是否会有所帮助。谢谢!
  • 搜索RAISERROR。为此,语法有所变化。想想2008是最后一个支持旧格式的版本

标签: sql-server stored-procedures sql-server-2016


【解决方案1】:

当您没有在正确版本的 SQL Server 上运行,或者数据库的兼容性级别设置不充分时,就会发生这种情况。所以改成130

检查兼容性级别:

select compatibility_level 
from sys.databases 
where name = '<database name>'

更改兼容性级别:

alter database <database-name> 
set compatibility level = 130 -- SQL Server 2016

所有 SQL 版本的兼容性级别列表:ALTER DATABASE (Transact-SQL) Compatibility Level

【讨论】:

  • 谢谢,@CR241,我会试试这个,并按照问题的 cmets 中的建议查看表触发器!
【解决方案2】:

重新发布答案,因为它是在对问题的评论中提出的。问题的解决方案是受影响的表上有我不知道的触发器。这些触发器的语法错误导致对表的插入和更新查询失败。

感谢 Jeroen Mostert https://stackoverflow.com/users/4137916/jeroen-mostert 提供的帮助!

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多