0

SQL Server 2008を使用していますが、データベースには、Student3列のという名前のテーブルがありますname, lastname, year

そのデータベースからさまざまな属性で学生を検索する機会をユーザーに提供したいと思います。Studentさまざまな方法で検索を実装できる3つのパラメーター(のすべての列)を持つ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

私はステートメントを3回書かなければなりませんif()!(階乗)回。したがって、8つの属性がある場合、これを記述することはほとんど不可能です。

それを行うための他のより良い方法、または私を助けることができる一種のエンジンはありますか?

4

1 に答える 1

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は、最初に実行した検索に基づいてクエリの計画を作成します。これは、SQLServerに検索ごとにクエリプランを再作成させるクエリヒントを追加することで解決できます。

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に頼る必要があります。しかし、それは別の質問に対する答えです。

于 2012-04-22T12:01:00.037 に答える