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了。

相关实践学习
使用交互方式创建数据表
本次实验主要介绍如何在RDS-SQLServer数据库中使用交互方式创建数据表。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
数据库基本概念(SQL,索引,视图,事务,日志等)(二)
数据库基本概念(SQL,索引,视图,事务,日志等)(二)
110 0
|
3天前
|
SQL 关系型数据库 MySQL
数据库基本概念(SQL,索引,视图,事务,日志等)(一)
数据库基本概念(SQL,索引,视图,事务,日志等)(一)
134 0
|
5天前
|
SQL 存储 数据库
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
23 0
|
5天前
|
SQL 关系型数据库 MySQL
SQL进阶之约束、索引
本实验带您学习SQL约束、索引、ALTER TABLE语句和AUTO INCREMENT字段的使用方法。
24 0
|
7天前
|
SQL XML Java
MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
16 0
|
21天前
|
SQL 存储 关系型数据库
为什么SQL语句命中索引比不命中索引要快?
有位粉丝面试高开的时候被问到,为什么SQL语句命中索引比不命中索引要快?虽然自己也知道答案,但被问到的瞬间,就不知道如何组织语言了。今天,我给大家深度分析一下。
17 0
|
24天前
|
SQL Oracle 关系型数据库
测一测自己的Sql能力之MYSQL的函数会造成索引失败
继续我们的SQL能力测试专题,今天的题目如下: SQL二:用户表(包含字段有:用户ID[自增]、姓名、性别、民族、出生日期、身份证号) 采用一个SQL语句,查询出: 用户总数,男性人数,女性人数, 民族是汉族的人数,民族是少数民族(非汉族)的人数,出生日期是1995年的人数,没有身份证号的人数
|
2月前
|
存储 SQL 缓存
MySQL高级第二篇(共四篇)之体系结构、存储引擎、优化SQL步骤、索引使用、SQL优化
最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安 全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
267 0
|
2月前
|
SQL 数据库 数据库管理
|
2月前
|
SQL 存储 搜索推荐
SQL索引的创建与删除
索引就好像我们书中的目录,是这一本书的综合,告诉你在书的什么地方能够找到一个特定的向,一看目录就可以看到你要找的东西在哪一页,不用从书的起始页开始,缩减了你的查询时间。
推荐文章
更多