2011-06-28 8 views
3

プロシージャのWHERE部分にオプションのパラメータを持つストアドプロシージャを作成したいとします。私のC#コードは、このprocのnullまたは有効なプロダクトIDを渡すことができます。ここにあります:SQL ServerでオプションのNULLパラメータを含める方法

declare @ProductID int 
set @ProductID = null 

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

このコードは機能しません。製品IDがヌルの場合は、「Hasbro」という名前の製品のみを検索します。製品IDがヌルでない場合は、名前に「Hasbro」という名前の製品を探し、一致する製品IDを探します。

ありがとうございます!

更新日:

ここに作業コードがあります。これを手伝ってくれてありがとうございました! @ProductIDが省略されている場合

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)) 

答えて

6

また、これは動作するはずです...

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

これは完全に機能しました!ありがとうございました! – Halcyon

+1

これは次のように簡略化できます。(@ProductIdはNULLかProductId = @ProductId) –

2

簡単な方法は、(すなわち、それは、ストアドプロシージャ呼び出しでNULLをだ)、そして、あなたは元の値に頼ると、ISNULL

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

この方法を用いることであろう本質的にそれはWHERE Name like '%Hasbro%' and ProductID = ProductIDに劣化します - その2番目の部分は常に真実になるでしょう。

あなたが投稿したコードによれば、今はまったくストアドプロシージャではありません。だけ知っているので、あなたは、SQL ServerのようなDECLAREパラメータ、ストアドプロシージャの宣言は次のようになりません。

CREATE PROCEDURE [dbo].[YourStoredProcName] 
    @ProductID = NULL 
AS 
BEGIN 
    -- stuff goes here 
END 

およびストアドプロシージャがちょうどEXEC YourStoredProcNameとして呼び出された場合、その後、その後、@ProductIDNULLなり、そのISNULL()コールが扱われます。


編集:この除くが、この場合には明らかにそれがNULL可能列、のために動作しません。ヌル以外の列については、これはおそらく最も簡単な解決策です。

+0

私はこれを実行すると結果が表内の行の合計数に比べて非常に小さいです。テーブルにはヌルの製品IDしかありません。私がproduct *からproduct *を実行すると、productidはnullではなく、私は1300以上の行を取得します。 – Halcyon

+0

'Name has '%Hasbro%''でフィルタリングしていますか? –

関連する問題