在某个子句中使用无效的列
-
13-09-2019 - |
题
假设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)的列,您的形状更好,逻辑。
除此之外,据说无效使查询变慢。
其他提示
我认为分析仪可能不会考虑您的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”
我不会这样做,因为它实际上替换了表条目