sql动态查询中的连接日期
我试图执行一个动态查询,其中我连接了一个日期,但没有成功sql动态查询中的连接日期,sql,sql-server,dynamic,concatenation,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 +'
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的任何日期]
请告诉我怎么做
谢谢。添加单引号
因为日期或字符串在单引号中指定如下内容'12-01-2014'
set @query = 'Select * from Table1 From tblEvent
Where (EventDate Between''' + @pStartDate + ''' and ''' + @pEndDate +''')'
添加单引号
因为日期或字符串在单引号中指定如下内容'12-01-2014'
set @query = 'Select * from Table1 From tblEvent
Where (EventDate Between''' + @pStartDate + ''' and ''' + @pEndDate +''')'
真正合适的方法是使用参数化查询,并让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注入攻击,因为它的执行计划可以重复用于后续执行。真正正确的方法是使用参数化查询,并让
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,这里有一个具有类似信息(和一个SQL FIDLE)。+1还有一个具有类似信息(和一个SQL FIDLE)。