简体   繁体   English

需要帮助建立动态查询,SQL Server 2008中的日期之间

[英]Need help build a dynamic query with Between dates in sql server 2008

I have UI where a user can search on optional parameters.I am writing a SP and as a testing database I am using AdventureWorks. 我有一个UI,用户可以在其中搜索可选参数。我正在编写SP,并且我正在使用AdventureWorks作为测试数据库。

For some reasons I dont seem to find a way how to include 由于某些原因,我似乎没有找到一种方法来包括

Where ModifiedDate between ''' + @Fromdate + ''' And '''+ @ToDate + '''') 在'''+ @Fromdate +'''和'''+ @ToDate +''''之间的ModifiedDate)

in my existing SP.Can you help? 在我现有的SP中可以提供帮助吗?

My sp looks like this 我的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

One thing I have not done is that some fields EG Surname the user can select "ALL" in the UI from the drop down. 我还没有做的一件事是,用户可以从下拉菜单的UI中选择某些字段EG Surname。 How would I implement a search where I dont have an exact parameter? 在没有确切参数的情况下如何执行搜索?

Thanks again for your help 再次感谢你的帮助

If I was to rewrite your stored proc, I would do the following 如果要重写您存储的proc,我将执行以下操作

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

This is better as its not executing text for the stored procedure and could be optimized. 这样比较好,因为它不执行存储过程的文本,并且可以对其进行优化。

If you want to use the dynamic sql, you could cast the date to a normal string, ie 如果要使用动态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) ) +  ''' '

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM