为什么不将nvarchar变量设置为null在此存储过程中不返回任何内容?

时间:2008-11-05 15:50:35

标签: sql sql-server tsql

当@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 个答案:

答案 0 :(得分:13)

尝试“IS NULL”而不是“= NULL”

答案 1 :(得分:3)

  

好奇,它只是一个语法上的原因,为什么=不能在nvarchar上使用NULL

有些人说NULL = NULL的计算结果为false。这是错的。 NULL = NULL计算结果为NULL。

结果(NULL)不为真,因此运行ELSE条件。

另请参阅:ThreeValuedLogic on Wikipedia

您应该注意的另一个影响 - 连接:NULL + @SomeVar计算为NULL。这可能会意外地消除计算字符串。

答案 2 :(得分:1)

您可以完全删除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子句变得更复杂,请确保添加任何必要的括号以对它们进行分组。

答案 3 :(得分:1)

使用“IS NULL”而不是“= NULL”

或者,要使“= NULL”工作,您可以在“CREATE PROCEDURE”之前写入“SET ANSI_NULLS OFF”。