我正在尝试执行动态查询,其中我正在连接日期但未能执行
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的日期]
请建议我怎么做。
感谢。
答案 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 +''')'