在数据库管理过程中,经常会遇到一些由于版本差异导致的问题。最近在对一个已存在的存储过程进行修改时,就遇到了这样一个问题。存储过程原本包含一个SELECT语句和几个公用表表达式(Common Table Expressions),并且一直运行正常。但当尝试保存修改时,却出现了错误。
修改的内容相当简单,只是增加了几个额外的列。查询语句类似于以下形式:
;WITH RESULT AS (
/*
Your logic */
SELECT
GETDATE() AS DTE
)
SELECT * FROM RESULT
然而,当尝试保存这些更改时,却抛出了以下错误:
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'RESULT'.
仔细检查了查询语句,并没有发现任何问题,语法看起来非常准确。于是尝试在不同的服务器上保存更改,结果发现没有出现任何错误。唯一的区别是,一个服务器运行的是SQL Server2012的较高版本。
在以下版本中运行正常:
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
May 14 2014 18:34:29
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)
而在以下版本中出现错误:
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)
通过Google搜索,发现'RESULT'是一个未来的保留关键字:
https://msdn.microsoft.com/en-us/library/ms189822.aspx
但仍然有一个疑问,为什么在早期版本中失败,而在最新版本中却成功了呢?如果有更多信息,请随时评论。
SQL Server的每个版本都可能引入新的功能和改进,同时也可能引入新的保留关键字。在本例中,'RESULT'在SQL Server 2012的某个更新版本中被添加为保留关键字。这意味着在该版本及之后的版本中,'RESULT'不能用作表名、列名或其他标识符。
在早期版本中,'RESULT'可能还不是一个保留关键字,因此查询可以正常执行。但在更新版本中,由于'RESULT'成为了保留关键字,使用它作为公用表表达式的名称会导致语法错误。
要解决这个问题,最简单的方法是更新SQL Server到最新版本。如果这不可能,那么需要修改查询,避免使用保留关键字作为标识符。例如,可以将'RESULT'更改为'RESULT_SET'或其他非保留关键字。