2012-04-22 38 views
0

我正在使用SQL Server 2008,並在我的數據庫中有一個名爲Student的表,其中有3列name, lastname, year按存儲過程的不同參數搜索SQL Server

我想讓用戶有機會通過不同的屬性從數據庫中搜索學生。我想寫一個存儲過程,它將有3個參數(所有列爲Student),可以用不同的方式實現搜索。

如果我寫的程序是這樣的:

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查詢計劃'選項(重新編譯)' – 2012-04-22 12:58:45