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个属性,那么写这个几乎是不可能的.
还有其他更好的方法可以做到这一点,还是一种可以帮助我的引擎?
有一个简单的解决方案:
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.但这是另一个问题的答案.
| 归档时间: |
|
| 查看次数: |
2840 次 |
| 最近记录: |