Использование нулевых столбцов в предложении WHERE
-
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 :Майкрософт.Производительность :Обнуляемый столбцы могут привести к тому, что конечные результаты будут оцениваться как NULL для предиката.
Я не вижу здесь проблемы.Ошибка связана с производительностью;MSDN говорит, что я должен использовать ISNULL() - но сравнение equals с NULL всегда равно false, верно?Я что-то упускаю из виду, или предупреждение просто неверное?
Решение
Я думаю, это относится к предложению WHERE .Это говорит о том, что и ваш параметр, и ваш столбец могут иметь значение NULL , и в этом случае ваше предложение WHERE больше не принимает значение 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
@ Радж:"ЕСЛИ ISNull(@id, -1) <> -1"
Я бы не стал этого делать, поскольку это фактически заменяет запись в таблице