2012-02-02 32 views
4

CountryIDがパラメータとして指定されていない限り、すべてCountry行を返すSPを作成したいとします。ここで私はそれがうまくいくかもしれないと想像していますが、それはそれが好きではありません。条件付きWHERE文SQL Server

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 
     SELECT * 
     FROM Countries 
     WHERE Active = 1 

     IF @CountryID > 0 BEGIN 
      AND @CountryID = CountryID 
     END 

END 

P.S.ありがとう私は上記の条件に基づいてSELECT文全体を単に繰り返すよりも良い方法があると思った。単一WHERE句で包むのに十分な簡単

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 AS BEGIN 

     IF @CountryID > 0 BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
      AND @CountryID = CountryID 
     END 
     ELSE BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
     END 

END 

答えて

8

それはエレガントだが、これを試してみてください:)

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 

    SELECT * 
    FROM Countries 
    WHERE Active = 1 
    AND (@CountryID = 0 OR @CountryID = CountryID) 

END 
+0

ああ、もちろん。私はこれを見ましたが、テーブルCountryIDに0と一致することを混乱させました。完璧、ありがとう – David

+0

それはあなたのために働いてうれしい。 –

4

はこのようにそれを実行します。この?

SELECT * 
     FROM Countries 
     WHERE Active = 1 
AND 
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0) 
+0

大量のselect文があっても、追加の条件を繰り返す必要がありますか? – David

+0

@Davidこれは読みやすくなっています。必要に応じて、他の回答の状態と同じようによりエレガントな方法を選択できます。しかし、覚えておいて、あなたは 'select'を繰り返すことができますが、実際には一つしか作成できません:P –

+0

私はselect文を繰り返す以外の何かをしたいと言ったのです。とにかくありがとう。 – David

4

SELECT * 
FROM Countries 
WHERE Active = 1 AND (@CountryID = 0 OR CountryID = @CountryID) 
+0

+1私も同じ答えを持っています:) –

2

ような何か