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

9/1/2015来源:SQL技巧人气:4644

SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.” 2015-03-08 23:54 by 潇湘隐者, ... 阅读, ... 评论, 收藏, 编辑

案例描述

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

数据库版本: SQL SERVER 2005

CREATETABLE TEST
(
 ID INT,
 Name VARCHAR(12)
);
CREATENONCLUSTEREDINDEX "[IDX_NAME]" ON TEST(Name);

因为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,显然就会出现找不到该索引的错误提示。

ALTERINDEX [IDX_NAME] ON [dbo].[TEST]
Reorganize With (LOB_COMPACTION = On);

clipboard[1]

消息 2727,级别 11,状态 1