Sql 日期时间语法错误

Sql 日期时间语法错误,sql,sql-server,sql-server-2008,tsql,stored-procedures,Sql,Sql Server,Sql Server 2008,Tsql,Stored Procedures,我是SQL Server的新手。我被一个我无法解决的问题困住了。我想写一个存储过程 TimeStamp列的数据类型为datetime 这是我的存储过程: @fetchtype int, @startdate nvarchar(22), @finishdate nvarchar(22) AS if (@fetchtype = 0) BEGIN PRINT('Select TimeStamp ' From WindData Where Time

我是SQL Server的新手。我被一个我无法解决的问题困住了。我想写一个存储过程

TimeStamp
列的数据类型为
datetime

这是我的存储过程:

    @fetchtype int,
    @startdate nvarchar(22),
    @finishdate nvarchar(22)
AS
    if (@fetchtype = 0)
    BEGIN
        PRINT('Select TimeStamp ' From WindData Where TimeStamp between '+@startdate+' and '+@finishdate)
        EXEC('Select TimeStamp ' From WindData Where TimeStamp between '+@startdate+' and '+@finishdate) 
    END
还有一个我的执行查询是

DECLARE @return_value int

EXEC    @return_value = [dbo].[Get_Values]
    @columnnames = N'V81_Avg',
    @fetchtype = 0,
    @startdate = N'2013-04-23 12:58:40.000',
    @finishdate = N'2013-04-23 12:59:00.000'

SELECT  'Return Value' = @return_value
但是当我执行我的查询时,我得到了这个错误

味精102,第15级,状态1,第1行
“12”附近的语法不正确


我想我没有正确地编写日期时间格式

这里的问题在SQL查询字符串中:

CREATE PROC yourSPName
(@fetchtype int,
@startdate nvarchar(22),
@finishdate nvarchar(22)
)
AS
DECLARE @sqlstr varchar(2500)
if (@fetchtype = 0)
BEGIN

Select TimeStamp From WindData Where TimeStamp between convert(datetime,@startdate) and convert(datetime,@finishdate)

END
应该是:

PRINT('Select TimeStamp From WindData Where TimeStamp between '''+@startdate+''' and '''+@finishdate+'''');
EXEC('Select TimeStamp From WindData Where TimeStamp between '''+@startdate+''' and '''+@finishdate+'''') 
但最好的方法是将这些参数用作日期时间,避免动态查询,并将
EXEC()
替换为只需选择:

@startdate datetime,
@finishdate datetime

...
Select TimeStamp From WindData Where TimeStamp between @startdate and @finishdate;
...

您需要在日期周围加上引号:

declare @sql nvarchar(max) = 'Select TimeStamp From WindData Where TimeStamp between '''+@startdate+''' and '''+@finishdate+'''')
EXEC(@sql);
或者,最好使用
sp_executesql

declare @sql nvarchar(max) = 'Select TimeStamp From WindData Where TimeStamp between @startdate and @finishdate')
exec sp_executesql @sql, N'@startdate date, @finishdate date', @startdate = @startdate, @finishdate = @finishdate;

startdate和enddate在此处为nvarchar,上述查询将不正确results@AnandPhadke:为什么不呢?SQL Server将在此动态SQL中自动将它们转换为日期时间。但正如我所写的,使用datetime参数和避免动态查询的最佳方法是操作系统。在上面的例子中,你肯定有不相等的开始引号和结束引号。不确定这是问题所在还是这里的打字错误。我猜是打字错误,问题可能是
datetime
varchar
之间(缺少)转换。但不确定到底是什么,直到你修复报价单。天哪!!!将DateTime.now中的引号“”放入SQL文本解决了我的问题!我从来没有想过在DateTime值中加引号,就像我从来没有在整数值中加引号一样。