zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”

server索引SQL &# with 39 遇到 关键字
2023-09-14 08:57:52 时间

案例描述

    这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(Its just a joke)。具体情况是YourSQLDba在做维护数据库索引时遇到了索引重组错误,然后我排查时就发现了这个案例。我下面用一个简单的测试例子演示一下具体情况。

 

数据库版本: SQL SERVER 2005


 

因为YourSQLDba生成重组索引语句时,都会在索引名称上加上[].如果用下面SQL语句进行索引重组,就会遇到这个错误

ALTER INDEX [[IDX_NAME]] ON [dbo].[TEST]

Reorganize With (LOB_COMPACTION = On);

消息 102,级别 15,状态 1,第 1 行

. 附近有语法错误。

消息 319,级别 15,状态 1,第 2 行

关键字 with 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。

clipboard

我们尝试去掉一对[],此时就会报"找不到索引IDX_NAME"的错误。其实这个好理解,因为双引 号被解释为字符串的边界,所以[IDX_NAME]才是真正的索引名称,但是如果你重建索引时使用[IDX_NAME], 那么[]就变成了解释字符边界的字符,索引名就成了IDX_NAME,显然就会出现找不到该索引的错误提示。


clipboard[1]

消息 2727,级别 11,状态 1,第 2 行

找不到索引 IDX_NAME。

如果在索引名称上加上"",那么索引名就成了[IDX_NAME], 那么此时就可以成功进行索引重建。这两者都好理解。


clipboard[2]

而使用[[IDX_NAME]]这种写法时,并不能完全让数据库引擎知道索引名为[IDX_NAME],有可能是语义解析时就有问题,这个我们也能理解,但是如果在MSSMS窗口将索引拖到查询窗口,你会惊奇的发现索引名变成了[[IDX_NAME]]]这个鸟样,不清楚为什么这样。这样的SQL进行索引重组也是成功的。

clipboard[3]

在SQL Server 2008下面测试,发现报错的提示有些不一样。如下所示:

clipboard[4]

 

当然测试过程中要求设置SET QUOTED_IDENTIFIER的值为ON,关于SET QUOTED_IDENTIFIER的设置为:

     当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。就是说双引号" "和标识符[]效果是一样样的,他们都表示引用的字符是数据库对象。单引号表示字符串的边界。

     当SET QUOTDE_IDENTIFIER OFF时,双引号被解释为字符串的边界,和单引号的作用是类似的。就是说双引号"不能当做标识符使用,但是可以当做字符边界,和单引号的效果是一样样的。

 

解决方法:

    既然搞清楚了原因,那么就很容易解决问题了。删除索引后,然后重建索引时取消双引号以及[]就OK了。


SQL去除数据库表中tab、空格、回车符等特殊字符的解决方法 原文:SQL去除数据库表中tab、空格、回车符等特殊字符的解决方法 按照ASCII码, SELECT char(64) 例如64 对应 @,则 SELECT REPLACE( abc@qq.
SqlServer 正确使用索引 在SqlServer对于没有SARG(search argument/SARG)运算符的表达式,索引是没有用的,SqlServer对它们很难使用比较优化的做法。
潇湘隐者 网名潇湘隐者/潇湘剑客、英文名Kerry,兴趣广泛,广泛涉猎,个性随意,不善言辞。执意做一名会写代码的DBA,混迹于IT行业
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载