能否通过批处理全局设置-I(QUOTED_IDENTIFIER ON)?有哪些负面影响?
全局设置QUOTED_IDENTIFIER=ON的可行性及负面影响分析
能否全局设置QUOTED_IDENTIFIER=ON?
可以通过以下几种方式实现全局层面的默认设置:
- 实例级全局生效:给SQL Server实例添加启动参数
-I,重启实例后,所有新建立的数据库连接默认QUOTED_IDENTIFIER为ON。 - 数据库级默认设置:执行
ALTER DATABASE [目标数据库名] SET QUOTED_IDENTIFIER ON;,后续在该数据库内创建的新连接会自动继承这个设置,无需逐个脚本修改。 - 登录级默认配置:针对特定登录账户修改默认会话属性,不过这种方式覆盖范围有限,适合局部场景。
全局设置后的负面影响场景
- 依赖双引号作为字符串常量的脚本:若原有脚本习惯用双引号包裹字符串(例如
SELECT * FROM orders WHERE status = "completed"),当QUOTED_IDENTIFIER=ON时,双引号会被解析为对象名(列名、表名等),直接导致脚本报错“找不到对象”。 - 旧存储过程/触发器的兼容性问题:SQL Server中存储过程、触发器等对象的
QUOTED_IDENTIFIER设置是创建时固化的,旧对象本身执行不受全局默认影响,但如果调用这些对象的脚本依赖会话级的OFF设置,或显式修改会话设置的逻辑被全局默认覆盖,可能引发执行异常。 - 第三方工具/老旧应用适配问题:部分老旧ETL工具、自定义应用会默认将
QUOTED_IDENTIFIER设为OFF,全局设置ON后,这些工具生成的SQL语句会因语法解析规则变化而执行失败。 - 动态SQL执行异常:如果动态SQL代码中用双引号拼接字符串内容,全局ON后双引号会被识别为对象标识符,导致动态SQL无法正确解析执行。
- 特定数据库对象的修改/重建失败:若数据库中存在依赖
QUOTED_IDENTIFIER=OFF创建的计算列、约束等对象,全局设置ON后,修改或重建这些对象时会因不符合设置要求而失败。
内容的提问来源于stack exchange,提问作者user3510083
相关产品推荐
相关产品推荐

