通过存储过程SQL Server的不同参数进行搜索

Kar*_*yan 0 sql search stored-procedures sql-server-2008

我正在使用SQL Server 2008,在我的数据库中,我有一个名为Student3的列表name, lastname, year.

我想让用户有机会通过不同的属性从该数据库中搜索学生.我想写一个存储过程,它将有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
Run Code Online (Sandbox Code Playgroud)

我必须写if()声明3!(阶乘)次.所以,如果我有8个属性,那么写这个几乎是不可能的.

还有其他更好的方法可以做到这一点,还是一种可以帮助我的引擎?

And*_*mar 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)
Run Code Online (Sandbox Code Playgroud)

虽然简单,但这会遇到"参数嗅探"的问题.基本上,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)
Run Code Online (Sandbox Code Playgroud)

如果您执行大量查询,则编译计划的开销可能会变得过高.在这种情况下,您必须使用动态SQL.但这是另一个问题的答案.