我需要编写一个存储过程,它将根据可选参数使用sql server 2008搜索表。
将有两种模式
高级搜索模式(使用可选参数而不使用SearchText。)
进行测试我正在使用AdventureWorks.Person.Contact表
你会写下面的内容如果不是你能提出如何改进的建议吗? 非常感谢
ALTER PROCEDURE SearchPeople
@SearchText nvarchar(200)=NULL, --- only used in basic search mode
@SearchMode bit,
@FirstName varchar(50)=NULL,
@LastName varchar(50)=NULL,
@EmailAddress varchar(50)=NULL,
@Phone nvarchar(25)=NULL
AS
IF @SearchMode=0
BEGIN
print 'BASIC SEARCH'
SELECT *
FROM [Person].[Contact]
WHERE (FirstName LIKE '%' + @SearchText + '%'
OR LastName LIKE '%' + @SearchText + '%'
OR EmailAddress LIKE '%' + @SearchText + '%'
OR Phone LIKE '%' + @SearchText + '%')
END
ELSE
BEGIN
print 'ADVANCED SEARCH'
SELECT *
FROM [Person].[Contact]
WHERE (FirstName =@FirstName OR @FirstName IS NULL)
AND (LastName =@LastName OR @FirstName IS NULL)
AND (EmailAddress =@EmailAddress OR @EmailAddress IS NULL)
AND (Phone =@Phone OR @Phone IS NULL)
END
答案 0 :(得分:2)
就个人而言,我将基本搜索和高级搜索拆分为两个单独的程序,并且我会认真考虑为您的基本搜索实施fulltext searching。
答案 1 :(得分:1)
我同意乔。您的解决方案将导致参数嗅探。解决param嗅探的一种方法是分成基本和高级搜索存储过程。但即便如此,您仍需要在高级搜索存储过程中使用动态SQL以避免参数嗅探。我不知道你的具体情况,但如果你只有一两个字段可以搜索,那么也许你不需要担心param嗅探,但如果你有,比方说,超过5或6个参数你肯定应该去使用动态SQL。
所以高级搜索应该是这样的。
DECLARE @query VARCHAR(MAX);
SET @query = 'SELECT *
FROM [Person].[Contact]
WHERE 1=1 '
IF @FirstName IS NOT NULL
SET @query = @query + ' AND FirstName = @FirstName '
IF @LastName IS NOT NULL
SET @query = @query + ' AND LastName = @LastName '
IF @EmailAddress IS NOT NULL
SET @query = @query + ' AND EmailAddress = @EmailAddress '
IF @Phone IS NOT NULL
SET @query = @query + ' AND Phone = @Phone '
sp_executesql @query,
N'@FirstName VARCHAR(50),
@LastName VARCHAR(50),
@EmailAddress VARHCAR(50),
@Phone NVARCHAR(25)',
@FirstName,
@LastName,
@EmailAddress,
@Phone
以下是有关参数嗅探http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx
的有用文章