jya*_*yao 13 sql-server t-sql sql-server-2012
我总是对一些神秘的 t-sql 行为感到困惑,如下所示
-- Create table t and insert values.
use tempdb
CREATE TABLE dbo.t (a INT NULL);
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);
GO
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a
Run Code Online (Sandbox Code Playgroud)
这不是关于如何检索表中的所有行,也不是关于避免使用 ANSI_NULLS。
我只是想征求一些见解,为什么 t-sql 会这样。
ype*_*eᵀᴹ 13
这是一个令人惊讶的行为,但从 MSDN 页面SET ANSI_NULLS,我们至少可以知道这是预期的行为。永不使用的另一个原因ANSI_NULLS OFF:
SET ANSI_NULLS仅当比较的操作数之一是 是NULL或 字面 量的变量时,才影响比较NULL。如果比较的两边都是列或复合表达式,设置不影响比较。
虽然从 msdn 文档中可能不是很清楚,但我相信您会发现以下内容是正确的
“仅当比较的操作数之一是 NULL 变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。如果比较的两边都是列或复合表达式,则该设置不会影响比较。”
Robert Sheldon 在 2015 年的以下帖子中讨论了 NULL 行为以及它们有时(但并非总是)失败的原因
https://www.simple-talk.com/sql/t-sql-programming/how-to-get-nulls-horribly-wrong-in-sql-server/
他描述了 13 个程序员很容易犯的 NULL 故障。
失败#1:不知道 NULL 意味着什么
说明:NULL是一个非值,一个不存在的值。它不为零。它不是一个空字符串。值不能等于 NULL。没有两个 NULL 值是相等的。
这是基本问题,但请务必阅读其他故障。
是的,早期版本(我相信是 SQL Server 7 之前的版本)的行为有所不同,更像是您想要的。
但是,如果您在 Stack Overflow 和 Stack Exchange 上搜索该问题,您会发现许多长线程讨论这些问题。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |