分类: SQLServer
因为下列 SET 选项的设置不正确: QUOTED_IDENTIFIER 报错问题解决

SQLServer使用SQLCMD部署SQL时,如SQL中使用了表变量,在SQLCMD部署时就会报错log如下:

'UPDATE 失败,因为下列 SET 选项的设置不正确: QUOTED_IDENTIFIER。请确保 SET 选项正确无误,
可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作

解决办法:

在SQL前面增加:
SET QUOTED_IDENTIFIER ON

使用SSMS窗口管理器执行相同的SQL很少会出现。
语法如下:

SET QUOTED_IDENTIFIER { ON | OFF }

解释说明:

当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。
有关更多信息,请参见使用标识符。文字可以由单引号或双引号分隔。

当 SET QUOTED_IDENTIFIER 为 ON 时,由双引号分隔的所有字符串都被解释为对象标识符。
因此,加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是保留关键字,
并且可以包含 Transact-SQL 标识符中通常不允许的字符。

不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。
如果单引号 (') 是文字字符串的一部分,则可以由两个单引号 ('') 表示。
当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER 必须为 ON。

当 SET QUOTED_IDENTIFIER 为 OFF(默认值)时,表达式中的文字字符串可以由单引号或双引号分隔。
如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。

当在计算列或索引视图上创建或操作索引时,SET QUOTED_IDENTIFIER 必须为 ON。
如果 SET QUOTED_IDENTIFIER 为 OFF,
则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。
有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。 

举例:SELECT * FROM  USER 正常情况的话,他会报错,因为USER是系统关键字,
我们知道可以给USER加上[],比如SELECT * FROM [USER] 来告诉数据库,这是一个表或者是视图,
将QUOTED_IDENTIFIER设为ON时,还可以这么写:SELECT * FROM "USER"

SET ANSI_NULLS ON是什么意思?

SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。
当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,
使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。
即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。
使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。
使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。
此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。

SET NOCOUNT ON:
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数).
当 SET NOCOUNT 为 OFF 时,返回计数.

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能.
VIA:https://www.cnblogs.com/baiyunchen/p/4983637.html


相关博文:

发表新评论