在Sql Server存储过程中的IF语句中,如何检查参数是否为空或null?

28

我看到了这个链接:如何检查Sql Server字符串是否为空,但它并没有在我的情况下帮助我。

以下是我存储过程的一部分代码:

IF (@item1 IS NOT NULL) OR (LEN(@item1) > 0)
        SELECT @sql = 'SELECT * FROM TEST1'
    ELSE
        SELECT @sql = 'SELECT * FROM TEST2'
 PRINT @sql;

@item1NVARCHAR(1000) 类型。

当执行该存储过程时,我提供了 item1 的值。

EXEC    [dbo].[my_proc]
        @item1 = N''

如果@item1 = N'some',则以下查询语句是正确的:

SELECT * FROM TEST1

而不是:

SELECT * FROM TEST2

在 SQL 中是否有一种函数可以验证字符串是否为空或 null,或者我犯了错误?

就像在 C# 中使用 string.IsNullOrEmpty(myValue) 一样。

5个回答

51

这是正确的行为。

如果您将 @item1 设置为一个值,下面的表达式将会为真。

IF (@item1 IS NOT NULL) OR (LEN(@item1) > 0)

无论如何,在SQL Server中没有这样的函数,但您可以创建自己的函数:

CREATE FUNCTION dbo.IsNullOrEmpty(@x varchar(max)) returns bit as
BEGIN
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0
    RETURN 0
ELSE
    RETURN 1
END

是的,我的错误在于使用了 OR 而不是 AND - Snake Eyes

16

要检查变量是否为空或者为null,请使用以下代码:

IF LEN(ISNULL(@var, '')) = 0
    -- Is empty or NULL
ELSE
    -- Is not empty and is not NULL

1
我喜欢这个想法,但是很想测试一下与其他方法相比的io性能。 - Casey ScriptFu Pharr

4

@item1 = N''时,它IS NOT NULL,所以这当然有效。

您可以在存储过程顶部默认定义@item1NULL,然后不传递参数。


已解决。问题在于“OR”。所以我改成了“AND”。 - Snake Eyes

0

首先,检查值是否为空,如果是,则转换为 null
然后检查是否为 null,如果是,则将其设为零
最后检查是否等于零

IF ISNULL(NULLIF(@item1,''), 0) = 0
BEGIN
     SELECT @sql = 'SELECT * FROM TEST2'
END
ELSE
BEGIN
    SELECT @sql = 'SELECT * FROM TEST1'
END

0
我在2012年使用了以下内容,它起作用了:
if (@MyCode  != '' and @MyCode is not null)
BEGIN
 --statements if not null or empty
END
ELSE
BEGIN 
 --statements if null or empty
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接