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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文: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语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
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
目录
打赏
0
0
0
0
216
分享
相关文章
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
SQL `CREATE DATABASE` 语法
【11月更文挑战第10天】
96 3
sql语法
【10月更文挑战第26天】sql语法
55 5
SQL学习一:ACID四个特性,CURD基本操作,常用关键字,常用聚合函数,五个约束,综合题
这篇文章是关于SQL基础知识的全面介绍,包括ACID特性、CURD操作、常用关键字、聚合函数、约束以及索引的创建和使用,并通过综合题目来巩固学习。
105 1
SQL数据库基础语法入门
[link](http://www.vvo.net.cn/post/082935.html)
SQL Server的Descending Indexes降序索引
【9月更文挑战第21天】在SQL Server中,降序索引允许指定列的排序顺序为降序,可显著优化涉及降序排序的查询性能,特别是在复合索引中。通过创建降序索引,可以更高效地满足特定业务需求,如按交易时间降序获取最新记录。然而,使用时需考虑查询频率、数据分布及维护成本,以确保最佳性能。
104 2
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
79 0
Mysql(2)—SQL语法详解
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发,旨在处理关系数据模型。
59 0
SQL server 特殊字符"\u0000"处理
【9月更文挑战第12天】在 SQL Server 中,空字符 `\u0000` 可能导致数据处理问题。解决方法包括:1) 查找包含该字符的数据,使用 `LIKE '%\u0000%'` 进行查询;2) 替换该字符,使用 `REPLACE` 函数将其替换为空或其他字符;3) 在应用程序中验证和清理输入数据,防止其插入数据库;4) 注意数据类型、索引性能及数据库设计,确保数据质量和可靠性。
322 0
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
70 5

热门文章

最新文章