合 SSMS配置错误,导致 SELECT 失败,因为下列 SET 选项的设置不正确: 'QUOTED_IDENTIFIER, ANSI_PADDING'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。
Tags: 故障处理MSSQLSQL ServerQUOTED_IDENTIFIERANSI_PADDING
现象
SELECT 失败,因为下列 SET 选项的设置不正确: 'QUOTED_IDENTIFIER, ANSI_PADDING'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。
SET QUOTED_IDENTIFIER介绍
使 SQL Server 遵从关于引号分隔标识符和文字字符串的 ISO 规则。 由双引号分隔的标识符可以是 Transact-SQL 保留关键字,也可以包含 Transact-SQL 标识符语法规则通常不允许的字符。
SET QUOTED_IDENTIFIER
为 ON(默认)时,可以用双引号 (" ") 分隔标识符,而文字必须用单引号 (' ') 来分隔。 所有用双引号分隔的字符串都被解释为对象标识符。 因此,加引号的标识符不必符合 Transact-SQL 标识符规则。 它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。 不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。 如果单引号 (') 是文本字符串的一部分,则可用两个单引号 ('') 表示。 当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER
必须为 ON。
当 SET QUOTED_IDENTIFIER
为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。 有关详细信息,请参阅 Database Identifiers。 文字可以由单引号或双引号分隔。 如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。
备注
QUOTED_IDENTIFIER 不影响括在方括号 ([ ]) 中的分隔标识符。
在创建或更改计算列的索引或索引视图时,SET QUOTED_IDENTIFIER
必须为 ON。 如果 SET QUOTED_IDENTIFIER
为 OFF,则对计算列或索引视图的索引所在的表执行 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 有关计算列的索引视图和索引所需的 SET 选项设置的详细信息,请参阅使用 SET 语句时的注意事项。
创建筛选索引时,SET QUOTED_IDENTIFIER
必须为 ON。
调用 XML 数据类型方法时,SET QUOTED_IDENTIFIER
必须为 ON。
在进行连接时,SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB Provider for SQL Server 自动将 QUOTED_IDENTIFIER 设置为 ON。 这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。 对来自 DB-Library 应用程序的连接,SET QUOTED_IDENTIFIER 默认设置为 OFF。
创建表时,即使此时将 QUOTED IDENTIFIER 选项设置为 OFF,该选项在表的元数据中仍始终存储为 ON。
创建存储过程时,将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置,并用于该存储过程的后续调用。
在存储过程内执行 SET QUOTED_IDENTIFIER 时,其设置不更改。
SET ANSI_DEFAULTS
为 ON 时,QUOTED_IDENTIFIER 也为 ON。
SET QUOTED_IDENTIFIER
还与 ALTER DATABASE 的 QUOTED_IDENTIFIER 设置相对应。
SET QUOTED_IDENTIFIER
在 Transact-SQL 分析时生效,只会影响分析,不影响查询优化或查询执行。
对于顶级即席批处理,请使用会话的当前 QUOTED_IDENTIFIER 设置开始分析。 分析批处理时,只要出现 SET QUOTED_IDENTIFIER
,就会更改之后的分析行为,并保存会话的设置。 因此,在对批处理进行分析和执行后,会话的QUOTED_IDENTIFIER设置将根据批处理中的最后一 SET QUOTED_IDENTIFIER
个匹配项进行设置。
存储过程中的静态 Transact-SQL 是使用对于创建或更改存储过程的批处理有效的 QUOTED_IDENTIFIER 设置分析的。 SET QUOTED_IDENTIFIER
作为静态 Transact-SQL 出现在存储过程的正文中时是无效的。
对于使用 sp_executesql
或 exec()
的嵌套批处理,使用会话的 QUOTED_IDENTIFIER 设置开始进行分析。 如果嵌套批处理在存储过程内,则使用存储过程的 QUOTED_IDENTIFIER 设置开始进行分析。 分析嵌套批处理时,只要出现 SET QUOTED_IDENTIFIER
,就会改变之后的分析行为,但不会更新会话的 QUOTED_IDENTIFIER 设置。
要查看此设置的当前设置,请运行以下查询:
1 2 3 4 5 6 7 | DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF'; IF ( (256 & @@OPTIONS) = 256 ) BEGIN SET @QUOTED_IDENTIFIER = 'ON'; END SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER; |
SET ANSI_PADDING 介绍
对列存储长度小于列的定义大小的值以及在 char、 varchar、 binary和 varbinary 数据中含有尾随空格的值的方式进行控制。
备注
SET ANSI_PADDING OFF
和 ANSI_PADDING OFF 数据库选项已弃用。 从 SQL Server 2017(14.x)开始,ANSI_PADDING始终设置为 ON。 在新的应用程序中不应使用已弃用的功能。 有关详细信息,请参阅 SQL Server 2017 中弃用的数据库引擎功能。
注解
使用 char、varchar、binary 和 varbinary 数据类型定义的列具有定义的大小。
此设置只影响新列的定义。 创建列后, SQL Server 会基于创建列时的设置存储这些值。 以后对此设置的更改不会影响现有的列。
备注
ANSI_PADDING 应始终设置为 ON。
下表显示在将值插入数据类型为 char、varchar、binary 和 varbinary 的列时,SET ANSI_PADDING 设置的效果。
展开表
设置 | char(n) NOT NULL 或 binary(n) NOT NULL | char(n) NULL 或 binary(n) NULL | varchar(n) 或 varbinary(n) |
---|---|---|---|
ON | 填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),以达到列的长度。 | 如果 SET ANSI_PADDING 为 ON,则遵从与 char(n) 或 binary(n) NOT NULL 相同的规则。 | 不剪裁插入 varchar 列中的字符值的尾随空格。 不剪裁插入 varbinary 列中的二进制值的尾随零。 不将值填充到列的长度。 |
OFF | 填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),以达到列的长度。 | 如果 SET ANSI_PADDING 为 OFF,则遵从与 varchar 或 varbinary 相同的规则。 | 剪裁插入 varchar 列中的字符值的尾随空格。 剪裁插入 varbinary 列中的二进制值的尾随零。 |
备注
进行填充时,char 列用空格填充,binary 列用零填充。 进行剪裁时,char 列的尾随空格被剪裁,binary 列的尾随零被剪裁。
在创建或更改计算列的索引或索引视图时,ANSI_PADDING 必须为 ON。 有关计算列的索引视图和索引需要的 SET 选项设置的详细信息,请参阅 SET 语句 (Transact-SQL) 中的“使用 SET 语句时的注意事项”。
SET ANSI_PADDING 的默认值为 ON。 SQL Server 的 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序在连接时会自动将 ANSI_PADDING 设置为 ON。 在连接之前,您可以在应用程序的 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性集合中配置此设置。 对于来自 DB-Library 应用程序的连接,SET ANSI_PADDING 的默认设置为 OFF。
SET ANSI_PADDING 设置不会影响 nchar、nvarchar、ntext、text、image、varbinary(max)、varchar(max) 和 nvarchar(max) 数据类型。 它们始终显示 SET ANSI_PADDING ON 行为。 这表示不剪裁尾随空格和尾随零。
如果 ANSI_DEFAULTS 为 ON,则启用 ANSI_PADDING。
ANSI_PADDING 的设置是在执行或运行时定义的,而不是在分析时定义的。
要查看此设置的当前设置,请运行以下查询。
SQL
1 2 3 | DECLARE @ANSI_PADDING VARCHAR(3) = 'OFF'; IF ( (16 & @@OPTIONS) = 16 ) SET @ANSI_PADDING = 'ON'; SELECT @ANSI_PADDING AS ANSI_PADDING; |
权限
要求 公共 角色具有成员身份。
示例
下面的示例演示了该设置对上述每个数据类型的影响。
将 ANSI_PADDING 设置为 ON 并对其进行测试。
SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | PRINT 'Testing with ANSI_PADDING ON' SET ANSI_PADDING ON; GO CREATE TABLE t1 ( charcol CHAR(16) NULL, varcharcol VARCHAR(16) NULL, varbinarycol VARBINARY(8) ); GO INSERT INTO t1 VALUES ('No blanks', 'No blanks', 0x00ee); INSERT INTO t1 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00); SELECT 'CHAR' = '>' + charcol + '\<', 'VARCHAR'='>' + varcharcol + '\<', varbinarycol FROM t1; GO |
现在将 ANSI_PADDING 设置为 OFF 并对其进行测试。