SQL Server: ISNULL на uniqueidentifier

Я пытаюсь сравнить столбец col1 и переменной @myvar на WHERE предложения. Оба обычно содержат GUID, но также могут иметь значения NULL. Я думал, что смогу обойти тот факт, что NULL=NULL оценивает значение FALSE с помощью WHERE ISNULL(col1, '')=ISNULL(@myvar, ''). Вместо этого можно сравнить две пустые строки и вычислить значение TRUE.

это, однако, приведет к следующему сообщению об ошибке:

Msg 8169, Уровень 16, состояние 2, Ошибка преобразования строки 3 при преобразовании из строка символов в uniqueidentifier.

пробовал

DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1

такое же сообщение об ошибке.

два вопроса: Во - первых, я пытаюсь преобразовать переменную uniqueidentifier - даже если она имеет нулевое значение-в (пустой!) строка, а не наоборот, как следует из сообщения об ошибке. Что происходит?

во-вторых, есть ли лучший способ сказать, что предложение WHERE мне нужно, чтобы позволить сравнивать uniqueidentifiers, которые могут быть NULL?

5 ответов


С первого аргумента вы передаете isnull не литерал null, он определит тип возврата этого вызова, a uniqueidentifier в вашем случае. Второй аргумент:'', не может быть приведен к этому типу, отсюда и ошибки вы получаете.

один из способов обойти это, чтобы явно проверить nulls:

WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)

Я думаю, что ниже выражение можно использовать, чтобы проверить, пуст ли столбец GUID

CAST(0x0 AS UNIQUEIDENTIFIER)

что-то типа

...WHERE GuidId <>  CAST(0x0 AS UNIQUEIDENTIFIER)

причина ISNULL не работает для вас в том, что значение замены (значение, которое будет использоваться, если выражение проверки действительно равно null) должно быть неявно конвертируемым в тип выражения проверки.

код WHERE предложение может использовать col IS NULL AND @var IS NULL чтобы проверить это состояние.


как указывали другие, исключите значения NULL из результатов, а затем выполните сравнение. Можно использовать COALESCE для исключения значений NULL из сравнений.


попробуйте следующий код:

WHERE ISNULL([Guid], NEWID()) = @myvar