在WHERE子句中使用可空列

时间:2009-12-05 12:43:36

标签: sql-server tsql static-analysis datadude

假设SQL Server中的表定义如下:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

一个查询:

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

在这种情况下,Visual Studio静态代码分析器会产生以下错误:

  

警告:SR0007:   Microsoft.Performance:Nullable   列可以导致最终结果   评估为谓词的NULL。

我没有在这里看到问题。错误与性能有关; MSDN说我应该使用ISNULL() - 但是与NULL的等于比较总是假的,对吧?我错过了什么,或警告是错的?

6 个答案:

答案 0 :(得分:3)

我认为它指的是WHERE子句。它说你的参数和列都可以是NULL,在这种情况下你的WHERE子句不再计算为true / false。通过将可以为空的列汇总到一个始终具有定义值的列(通过ISNULL),您可以在逻辑上更好地形成。

Here's the Microsoft documentation on that error.

另外,NULL可能会使查询变得更慢。

答案 1 :(得分:1)

我认为分析师可能没有考虑你的IF声明。

您的代码对我来说似乎是正确的。

答案 2 :(得分:1)

我认为这是一个虚假的警告 - 您可以根据具体情况对其进行压制,还是完全针对该特定警告?

当你这样做时会发生什么?:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

答案 3 :(得分:0)

空比较取决于设置。

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

这是 from here

答案 4 :(得分:-2)

IF @id IS NOT NULL

应替换为

IF ISNull(@id, -1) <> -1

答案 5 :(得分:-3)

@ Raj:“IF ISNull(@ id,-1)&lt;&gt; -1”

我不会这样做,因为它实际上取代了表条目