【问题标题】:Search by different parameters of stored procedure SQL Server按存储过程SQL Server的不同参数搜索
【发布时间】:2012-05-03 07:23:15
【问题描述】:

我使用的是 SQL Server 2008,在我的数据库中有一个名为 Student 的表,其中包含 3 列 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 个属性,几乎不可能写出来。

有没有其他更好的方法可以帮助我?

【问题讨论】:

    标签: sql sql-server-2008 search stored-procedures


    【解决方案1】:

    有一个简单的解决方案:

    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。但这是另一个问题的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 2017-03-20
      • 2018-12-11
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2016-08-29
      相关资源
      最近更新 更多