sql动态查询中的连接日期

时间:2014-08-13 05:02:53

标签: sql sql-server dynamic concatenation

我正在尝试执行动态查询,其中我正在连接日期但未能执行

DECLARE @pStartDate datetime  
DECLARE @pEndDate datetime
DECLARE @query nvarchar(MAX)

动态查询1

set @query = 'Select * from Table1 From tblEvent
              Where (EventDate Between' + @pStartDate + ' and ' + @pEndDate +')'
Exec(@query)

错误

  

从字符串转换日期和/或时间时转换失败。

动态查询2

set @query = 'Select * from Table1 From tblEvent
              Where (EventDate Between' + cast(@pStartDate as varchar) + ' and ' + cast(@pEndDate as varchar) +')'
Exec(@query)  

错误

  

1 [1附近的语法错误代表我传递给@pStartDate的日期]

请建议我怎么做。

感谢。

2 个答案:

答案 0 :(得分:3)

非常正确这样做的方法是使用参数化查询并让sp_executeSql执行此操作:

DECLARE @pStartDate datetime  
DECLARE @pEndDate datetime

DECLARE @query nvarchar(MAX)

SET @pStartDate = '20080301'
SET @pEndDate = '20080331'

-- if you're setting a NVARCHAR variable - **DO USE** the N'..' prefix!
SET @query = N'SELECT * FROM dbo.Table1
               WHERE OrderDate BETWEEN @StartDate AND @EndDate'

-- execute the dynamic SQL, with a list of parameters, and their values    
EXEC sp_executesql @query, 
                   N'@StartDate DATETIME, @EndDate DATETIME', 
                   @StartDate = @pStartDate, @EndDate = @pEndDate

在这种情况下,没有摆弄字符串连接,缺少引号和杂乱的东西 - 只是一个清晰,正确参数化的查询,不容易受到SQL攻击注入攻击,并执行更好,因为它的执行计划可以重复用于后续执行。

答案 1 :(得分:1)

添加单引号。

因为日期或字符串在单引号中指定,如'12-01-2014'

set @query = 'Select * from Table1 From tblEvent
Where (EventDate Between''' + @pStartDate + ''' and ''' + @pEndDate +''')'