我想创建一个存储过程,在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 ))
答案 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
将@ProductID
,NULL
调用将会有效。
<小时/> 编辑:除了这不能为可以为空的列工作,在这种情况下显然是这样。对于任何不可为空的列,这可能是最简单的解决方案。