2010-11-10 25 views
0

我有用户可以搜索可选参数的用户界面。我正在编写一个SP,并作为测试数据库使用AdventureWorks。需要帮助建立一个与SQL Server 2008中的日期之间的动态查询

对于一些原因,我似乎没有找到一个方法如何包括

凡ModifiedDate '' '+ @Fromdate + ''' 和 '' '+ @ToDate + '''')之间

在我现有的SP中。你能帮忙吗?

我的SP看起来像这样

ALTER PROCEDURE SearchPerson_Dynamic 
(
@FirstName NVARCHAR(50) = NULL, 
@LastName NVARCHAR(50) = NULL, 
@EmailAddress NVARCHAR(50) = NULL, 
@Phone NVARCHAR(25) = NULL, 
@FromDate DATETIME =NULL, 
@ToDate DATETIME =NULL 

AS 
DECLARE @sSQL NVARCHAR(MAX), @Where NVARCHAR(1000) = '' 
SET @sSQL = 'SELECT * FROM [Person].[Contact]' 

IF @FirstName is not null 
SET @Where = @Where + 'AND FirstName = @_FirstName ' 
IF @LastName is not null 
SET @Where = @Where + 'AND LastName = @_LastName ' 
IF @EmailAddress IS NOT NULL 
SET @Where = @Where + 'AND EmailAddress = @_EmailAddress ' 
IF @Phone IS NOT NULL 
SET @Where = @Where + 'AND Phone = @_Phone ' 

-- NEED TO INTEGRATE A SEARCH BETWEEN @FromDate and @ToDate 

IF LEN(@Where) > 0 
SET @sSQL = @sSQL + 'WHERE ' + RIGHT(@Where, LEN(@Where)-3) 

EXEC sp_executesql @sSQL, 
    N'@_FirstName VARCHAR(50), 
      @_LastName VARCHAR(50), 
      @_EmailAddress VARCHAR(50), 
      @_Phone NVARCHAR(25)', 
    @_FirstName = @FirstName, 
      @_LastName = @LastName, 
      @_EmailAddress = EmailAddress, 
      @_Phone = @Phone 
      MISSING @FROMDate and @ToDate --HOW DO i DO IT HERE 

有一件事我还没有做的是,一些领域EG姓,用户可以从下拉UI“ALL”选择。我如何在没有确切参数的情况下执行搜索?再次

感谢您的帮助

+0

总是值得一读厄兰Sommarskog的动态搜索的文章,如果你还没有前:HTTP:/ /www.sommarskog.se/dyn-search.html。另外,您遇到的问题是将@FromDate和@ToDate添加到搜索中? – 2010-11-10 07:51:59

+0

感谢您的回复。是否正确如果@FromDate不为null且@ToDate不为null设置where = @其中'''+ @Fromdate +'''和'''+ @ToDate +'''''之间的+'ModifiedDate' 另外在executeSql中,我只需添加@ _FromDate = @ FromDate,@ _ ToDate = @ ToDate – user9969 2010-11-10 08:49:37

回答

3

如果我是重写你的存储过程,我会做以下

ALTER PROCEDURE SearchPerson_Dynamic 
(
@FirstName NVARCHAR(50) = NULL, 
@LastName NVARCHAR(50) = NULL, 
@EmailAddress NVARCHAR(50) = NULL, 
@Phone NVARCHAR(25) = NULL, 
@FromDate DATETIME =NULL, 
@ToDate DATETIME =NULL 
) 
as 
begin 

    SELECT * FROM [Person].[Contact] 
    where 
     FirstName = coalesce(@FirstName, FirstName) and 
     LastName = coalesce(@LastName, LastName) and 
     EmailAddress = coalesce(@EmailAddress, EmailAddress) and 
     Phone = coalesce(@Phone, Phone) and 
     ModifiedDate >= coalesce(@FromDate, FromDate) and 
     ModifiedDate <= coalesce(@ToDate, ToDate) 
end 

这是因为其不执行文本更好地为存储过程可以优化。

如果要使用动态SQL,你可以投的日期到正常的字符串,即

IF @FromDate IS NOT NULL AND @ToDate IS NOT NULL 
    SET @Where = @Where + 'AND ModifiedDate between ''' + cast(@FromDate as varchar(50)) + ''' and ''' + cast(@ToDate as varchar(50)) + ''' ' 
+0

这样的查询很可能会进行表扫描。 – 2010-11-10 07:57:06

+0

确实如此,除非你把'OPTION(RECOMPILE)'放进去。仅供参考,有一个真正的好文章,在这http://sommarskog.se/dyn-search.html – 2010-11-10 08:25:41

+0

你是否说,如果你把选项(重新编译)它不会做表扫描? – user9969 2010-11-10 08:45:35