繁体   English   中英

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

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

我有一个UI,用户可以在其中搜索可选参数。我正在编写SP,并且我正在使用AdventureWorks作为测试数据库。

由于某些原因,我似乎没有找到一种方法来包括

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

在我现有的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

我还没有做的一件事是,用户可以从下拉菜单的UI中选择某些字段EG Surname。 在没有确切参数的情况下如何执行搜索?

再次感谢你的帮助

如果要重写您存储的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

这样比较好,因为它不执行存储过程的文本,并且可以对其进行优化。

如果要使用动态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