假设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的等于比较总是假的,对吧?我错过了什么,或警告是错的?
答案 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”
我不会这样做,因为它实际上取代了表条目