0

我正在使用 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

我必须写if()声明 3!(阶乘)次。所以,如果我有 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 会根据您运行的第一个搜索为查询创建一个计划。这可以通过添加一个查询提示来解决,该提示强制 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。但这是另一个问题的答案。

于 2012-04-22T12:01:00.037 回答