3

假设 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:可为空的列可能导致最终结果被评估为谓词的 NULL。

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

4

6 回答 6

4

我认为它指的是 WHERE 子句。意思是您的参数和列都可以为 NULL,在这种情况下,您的 WHERE 子句不再计算为真/假。通过将您的可为空列汇集到一个始终定义值的列中(通过 ISNULL),您在逻辑上处于更好的状态。

这是有关该错误的 Microsoft 文档。

另一方面,NULL 据说会使查询变得更慢。

于 2009-12-05T13:03:49.070 回答
1

我认为分析器可能只是没有考虑您的 IF 语句。

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

于 2009-12-05T12:59:54.647 回答
1

空比较取决于设置。

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.

这是从这里

于 2009-12-05T13:37:59.473 回答
1

我认为这是一个虚假的警告——你能根据具体情况压制它,还是完全压制那个特定的警告?

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

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)
于 2009-12-05T17:06:20.470 回答
-2
IF @id IS NOT NULL

应该替换为

IF ISNull(@id, -1) <> -1
于 2009-12-05T12:47:17.663 回答
-3

@Raj:“如果 ISNull(@id, -1) <> -1”

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

于 2009-12-05T13:03:02.207 回答