Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql动态查询中的连接日期_Sql_Sql Server_Dynamic_Concatenation - Fatal编程技术网

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)。