Вопрос

Предположим, что определение таблицы в 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"

Я бы не стал этого делать, поскольку это фактически заменяет запись в таблице

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top