SQL server `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON` 的作用

`SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON` 是 SQL Server 中用于控制特定行为的会话设置选项。它们分别影响数据库引擎如何处理 NULL 值的比较以及如何识别标识符和字符串文字。具体作用如下:

### SET ANSI_NULLS ON

**作用:**
- **NULL 值的比较行为:** 当 `SET ANSI_NULLS` 设置为 `ON` 时,查询遵循 SQL-92 标准中对 NULL 值处理的规定。在这种模式下:
  - **比较运算符:** 在涉及 NULL 值的任何比较(如 `=`, `<>`, `<`, `>`, `<=`, `>=`)中,如果其中一个操作数是 NULL,结果总是 `UNKNOWN` 而不是 `TRUE` 或 `FALSE`。这包括在 `WHERE` 子句、`JOIN` 条件以及其他需要进行值比较的上下文中。
  - **逻辑运算符:** 在逻辑表达式中,`NULL` 与 `AND`、`OR` 操作一起使用时,遵循三值逻辑(真、假、未知)。例如,`NULL AND True` 以及 `NULL OR False` 的结果都是 `UNKNOWN`。
  - **聚合函数:** 对包含 NULL 值的列使用聚合函数(如 `COUNT()`, `SUM()`, `AVG()` 等),`NULL` 值通常会被忽略(除非使用 `COUNT(*)`,它计数行而不考虑 NULL 值)。

### SET QUOTED_IDENTIFIER ON

**作用:**
- **标识符的引用:** 当 `SET QUOTED_IDENTIFIER` 设置为 `ON` 时:
  - **双引号作为标识符分隔符:** 标识符(如表名、列名、视图名、存储过程名等)可以使用双引号 (`"`) 引起来,以允许使用保留字或包含特殊字符(如空格、破折号等)的名称。在双引号内,标识符按照其精确拼写进行解析,不受大小写敏感性规则的影响。
  - **字符串文字的引号:** 文字字符串必须使用单引号 (`'`) 分隔。这意味着在 `SET QUOTED_IDENTIFIER ON` 下,双引号用于标识符,单引号用于文本字符串,二者分工明确,避免混淆。

**重要性:**
- **兼容性和标准一致性:** 使用这些设置有助于确保代码与 SQL-92 标准保持一致,提高跨不同数据库系统的可移植性。
- **防止命名冲突与解析错误:** 启用 `QUOTED_IDENTIFIER` 允许使用保留字作为对象名(只要它们被正确引用),并允许创建包含特殊字符或不符合标识符命名规则的名称,从而增加了命名灵活性,同时减少了因名称相似导致的解析错误。
- **正确的 NULL 处理:** `ANSI_NULLS ON` 确保了对 NULL 值的比较始终遵循标准逻辑,避免在编写查询时因疏忽 NULL 值处理而导致意外的结果或性能问题。

通常,建议在编写 SQL Server 脚本、创建对象(如视图、存储过程等)时,默认使用 `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON`,以确保代码遵循 SQL 标准,增强可读性、可维护性和跨版本/平台的兼容性。许多现代 SQL Server 实例默认启用了这些设置,但在某些情况下(如旧版数据库或特定的会话要求),可能需要显式指定这些设置。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值