如何在SQL Server中包含可选的Null参数

时间:2011-06-28 20:57:32

标签: c# sql sql-server database stored-procedures

我想创建一个存储过程,在proc的WHERE部分中有一个可选参数。我的C#代码可以传入null或此proc的有效产品ID。这是:

declare @ProductID int
set @ProductID = null

select
    *
from
    Products
where   
    Name like '%Hasbro%'
    if @ProductID is not null
        begin
            and ProductID = @ProductID
        end

此代码不起作用。如果产品ID为null,我希望它只查找名为'Hasbro'的产品。如果产品ID不为null,我希望它在其中查找名为“Hasbro”的产品以及匹配产品ID。

谢谢!

更新:

这是工作代码。谢谢大家帮我解决这个问题!

declare @ProductID int
set @ProductID = null

select
    *
from
    Products
where
    Name like '%Hasbro%'
    and (( @ProductID is null ) or ( @ProductID is not null and ProductID = @ProductID ))

2 个答案:

答案 0 :(得分:6)

这也应该有用......

select
    *
from
    Products
where
    Name like '%Hasbro%' and
    (
      ( @ProductID is null ) or
      ( @ProductID is not null and ProductID = @ProductID ) 
    )

答案 1 :(得分:2)

更简单的方法是使用ISNULL

where
    Name like '%Hasbro%'
    and ProductID = ISNULL(@ProductID, ProductID)

这样,如果省略@ProductID(即,它在存储过程调用中的NULL),那么您将回退到原始值并且基本上它降级为{{1 - 第二部分总是如此。

虽然根据您发布的代码,但它现在不是存储过程。只是你知道,你不像SQL Server那样WHERE Name like '%Hasbro%' and ProductID = ProductID参数,你的存储过程声明看起来像:

DECLARE

然后,如果仅将CREATE PROCEDURE [dbo].[YourStoredProcName] @ProductID = NULL AS BEGIN -- stuff goes here END 调用存储过程,那么EXEC YourStoredProcName@ProductIDNULL调用将会有效。

<小时/> 编辑:除了这不能为可以为空的列工作,在这种情况下显然是这样。对于任何不可为空的列,这可能是最简单的解决方案。