2017-05-13 1 views
2

実行するために4つのパラメータを必要とするストアドプロシージャがあります。しかし、私は3つのパラメータだけを渡して実行したい。それをどうすれば実現できますか?少ない入力パラメータでストアドプロシージャを実行

例:私のストアドプロシージャは通常、このように実行されます。

EXEC usp_my_sp @fname = 'Sandeep', 
       @lname = 'Kumar', 
       @age = '26', 
       @city = 'New Delhi'** 

それは年齢= 26、Sandeep Kumarという名前のすべての人々を返し、New Delhiに住んでいます。

しかし、私はすべての都市から、年齢26のSandeep Kumarという名前のすべての人を取得したいと思います。ここでは、4番目のパラメータを省略する必要があります。

どうすれば実現できますか?

おかげで、 サンディープ

答えて

1

あなたは、動的な検索条件でキャッチすべてのクエリを記述しています。

where (t.city = @city or @city is null) 

一部も

where t.city = isnull(@city,t.city) 
としてこれを書く: @cityはこのような何か( tは、あなたのテーブルの別名である)であるためには

基本非最適化ソリューションは、where句を変更することです

両方のオプションが正しい結果セットを返しますが、プロシージャの場合、これにより、指定されたパラメータセットに対してキャッシュされたプランが最適以下になることがあります。この状況を改善するためのいくつかのソリューションがあります。最も簡単なのは、クエリの末尾にoption(recompile)を追加することです。これにより、プロシージャの各呼び出しに対して新しいクエリプランが生成されるため、実行ごとに若干のオーバーヘッドが発生します。

より複雑なソリューションは、動的SQLを使用してクエリを書き直すでしょうし、そのために私は、次のリソースをご案内いたします。

キャッチすべてのクエリ参照:

3

nullの既定値を持つパラメーターを作成し、Where節述部をcoalesce()(またはIsNUll())と記述します。

Create procedure MySP 
    @fName varchar(50) = null, 
    @lName varchar(50) = null, 
    @age byte = null, 
    @city varchar(30) = null 
as 
     Select -- stuff 
     From MyTable 
     Where firstName = coalesce(@fName, firstName) 
      and lastName = coalesce(@lName, LastName) 
      and City = coalesce(@city , City) 
      and lastName = coalesce(@lName, LastName) 
関連する問題