SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”-阿里云开发者社区

开发者社区> 杰克.陈> 正文

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

简介: 原文:SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.” 案例描述     这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(It's just a joke)。
+关注继续查看
原文:SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”

案例描述

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

 

数据库版本: SQL SERVER 2005

CREATE TABLE TEST
 
(
 
 ID     INT,
 
 Name   VARCHAR(12)
 
);
 
CREATE NONCLUSTERED INDEX "[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 子句,那么前一个语句必须以分号结尾。

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

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

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

找不到索引 'IDX_NAME'。

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

ALTER INDEX "[IDX_NAME]" ON [dbo].[TEST]
 
Reorganize With (LOB_COMPACTION = On);
 

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

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

 

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

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

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

 

解决方法:

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”
原文:SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.” 案例描述     这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(It's just a joke)。
767 0
RDS SQL Server - 最佳实践 - 高CPU使用率系列之二索引碎片
# 摘要 上一篇文章分析了高CPU使用率的原因之一是索引缺失,接下来本系列文章之二的“索引碎片”是CPU高使用率的又一常见的原因。解决索引碎片问题是解决SQL Server服务响应缓慢,查询超时的又一利器。 # 问题引入 “鸟哥,我上一篇文章分享了因为索引缺失导致CPU高使用率的话题,反响不错。接下来,我打算分享索引碎片导致CPU高使用率的话题。”,菜鸟主动找到老鸟汇报工作。 上一篇文章详
3540 0
params,out和ref的关键字区别
(一)params---------可以让参数随意变化的关键字         1 staticvoid Main(string[] args) 2 { 3 TestParams(1, 2, 3); 4 TestParams(1, 2, 3, 4, 5, 6);//注意参数随意变换...
551 0
PostgreSQL Heap Only Tuple - HOT (降低UPDATE引入的索引写IO放大)
标签 PostgreSQL , Heap Only Tuple , HOT 背景 PostgreSQL目前默认的存储引擎在更新记录时,会在堆内产生一条新版本,旧版本在不需要使用后VACUUM回收,回收旧版本前,需要先回收所有关联这个版本的所有索引POINT。
1640 0
分布式关系型数据库服务 DRDS 支持全局二级索引,可完成多维字段拆分
信息摘要: DRDS 支持全局二级索引,提供全局二级索引,全局唯一索引的创建、查看,可完成多维字段拆分适用客户: 数据库使用者 / 分布式数据库使用者 / 分库分表 / 开发者 / 互联网企业 / 金融保险行业 / 新零售行业版本/规格功能: 新功能: 新增支持创建全局二级索引、创建全局唯一索引...
1077 0
T-SQL with关键字 with as 递归循环表
Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误: SELECT YEAR(OrderDate) AS OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts FROM dbo.Orders GROUP BY OrderYear; 因为group by是在Select之前进行的,那个时候orderYear这个列并没有形成。
897 0
Windows Server 2016 检查更新时,错误代码8024401C 的解决方案
这个问题的核心是连接不到更新服务器,一部分情况是因为IPV6导致,关闭IPV6即可解决。 Windows Server关闭ipv6的办法: 开始 -> 运行 - > 输入 Regedit 进入注册表编辑器定位到: [HKEY_LOCAL_MACHINESYSTEMCurrentControlSet.
1689 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载