当前位置:   article > 正文

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

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 实例默认启用了这些设置,但在某些情况下(如旧版数据库或特定的会话要求),可能需要显式指定这些设置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/409488
推荐阅读
相关标签
  

闽ICP备14008679号