2012-04-22 7 views
0

私はSQL Server 2008を使用しています。私のデータベースにはStudentというテーブルがあり、3列のname, lastname, yearがあります。ストアドプロシージャのさまざまなパラメータで検索SQL Server

私は、ユーザーに異なる属性によってそのデータベースの生徒を検索する機会を与えたいと考えています。私は、異なる方法で検索を実装することができる3つのパラメータ(すべての列がStudent)を持つ1つのストアドプロシージャを書きたいと思います。私は手順をこのよう記述する場合

:!

Create Procedure ProcSearchStudents 
@name nchar(20) = NULL, 
@lastname nchar(20) = NULL, 
@year int = NULL, 
AS 

if(@lastname = NULL) 
BEGIN 
Select * 
from Student 
where name = @name 
and year = @year 
END 

if(@name = NULL) 
BEGIN 
Select * 
from Student 
where lastname = @lastname 
and year = @year 
END 

if(@year = NULL) 
BEGIN 
Select * 
from Student 
where name = @name 
and lastname = @lastname 
END 

... 
... 

GO 

を私はif()の文3(階乗)回を記述する必要があります。だから、もし私が8つの属性を持っていれば、これを書くことはほとんど不可能です。

これを行うには他の方法がありますか、それともエンジンのようなものがありますか?

答えて

6

簡単な解決策があります:シンプルなものの

select * 
from Student 
where (@name is null or Name = @name) 
     and (@lastname is null or LastName = @lastname) 
     and (@year is null or Year = @year) 

、これは「パラメータスニッフィング」の問題に苦しんでいます。基本的に、SQL Serverは最初に実行する検索に基づいてクエリの計画を作成します。これは、すべての検索のためのクエリプランを再作成するために、SQL Serverを強制的にクエリヒントを追加することで解決することができます:あなたは、クエリの多くを行う場合は

select * 
from Student 
where (@name is null or Name = @name) 
     and (@lastname is null or LastName = @lastname) 
     and (@year is null or Year = @year) 
option (recompile) 

は、計画のコンパイルのオーバーヘッドが高くなりすぎることができます。その場合は、動的SQLを使用する必要があります。しかし、それは別の質問に対する答えです。

+0

+1クエリプラン 'option(再コンパイル)' –

関連する問題