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

我在这里看不到问题。错误与性能有关; MSDN说我应该使用isnull() - 但是与null的比较始终是错误的,对吗?我错过了什么,还是警告是错误的?

有帮助吗?

解决方案

我认为这是指where子句。这是说您的参数和列都可以为null,在这种情况下,您的子句不再评估为true/false。通过将您的无效列汇入一个始终定义的值(通过ISNULL)的列,您的形状更好,逻辑。

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

除此之外,据说无效使查询变慢。

其他提示

我认为分析仪可能不会考虑您的if声明。

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

我认为这是一个虚假的警告 - 您可以逐案或完全警告吗?

当您这样做时会发生什么?

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

零比较取决于设置。

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.

这是 从这里.

IF @id IS NOT NULL

应该替换

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

@ raj:“如果isnull(@id,-1)<> -1”

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top