Почему установка переменной nvarchar в null ничего не возвращает в этом хранимом процессе? - PullRequest
4 голосов
/ 05 ноября 2008

Когда для @RadioServiceGroup задано значение NULL, я хочу вернуть все записи из таблицы sbi_l_radioservicecodes, которая содержит около 120 записей. Однако, когда я выполняю следующую процедуру и устанавливаю @RadioServiceGroup в NULL, он не возвращает никаких записей. Вот хранимый процесс:

CREATE PROCEDURE [dbo].[GetRadioServiceCodes] 
@RadioServiceGroup nvarchar(1000) = NULL
AS
BEGIN
IF(@RadioServiceGroup = NULL)
    BEGIN
        SELECT rsc.RadioService
        FROM sbi_l_radioservicecodes rsc    
    END
    ELSE
    BEGIN       
        SELECT rsc.RadioService
        FROM sbi_l_radioservicecodes rsc
        WHERE rsc.RadioServiceGroup = @RadioServiceGroup    
    END
END

Ответы [ 4 ]

13 голосов
/ 05 ноября 2008

Попробуйте "IS NULL" вместо "= NULL"

3 голосов
/ 05 ноября 2008

Любопытно, это просто синтаксис о том, почему = не работает на nvarchar для NULL

Некоторые люди говорят, что NULL = NULL оценивается как ложное. Это не верно. NULL = NULL оценивается как NULL.

Результат (NULL) неверен, поэтому выполняется условие ELSE.

См. Также: ThreeValuedLogic в Википедии

Еще один эффект, о котором вам следует знать - Объединение: NULL + @SomeVar оценивается как NULL. Это может неожиданно уничтожить вычисленную строку.

1 голос
/ 05 ноября 2008

Используйте «IS NULL» вместо «= NULL»

В качестве альтернативы, чтобы "= NULL" работал, вы можете написать "SET ANSI_NULLS OFF" перед "CREATE PROCEDURE".

1 голос
/ 05 ноября 2008

Вы можете вырезать If полностью. Попробуйте это:

CREATE PROCEDURE [dbo].[GetRadioServiceCodes] 
@RadioServiceGroup nvarchar(1000) = NULL
AS
BEGIN              
    SELECT rsc.RadioService
    FROM sbi_l_radioservicecodes rsc
    WHERE 
        rsc.RadioServiceGroup = @RadioServiceGroup    
        OR @RadioServiceGroup IS NULL
END

Убедитесь, что вы добавили все необходимые скобки, чтобы сгруппировать их, если предложение where усложняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...