1

我是 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”附近的语法不正确。

我认为我没有正确编写日期时间格式。

4

3 回答 3

2

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

它应该是:

PRINT('Select TimeStamp From WindData Where TimeStamp between '''+@startdate+''' and '''+@finishdate+'''');
EXEC('Select TimeStamp From WindData Where TimeStamp between '''+@startdate+''' and '''+@finishdate+'''') 

但最好的方法是将这些参数用作 DATETIME 并避免动态查询并EXEC()仅用 SELECT 替换:

@startdate datetime,
@finishdate datetime

...
Select TimeStamp From WindData Where TimeStamp between @startdate and @finishdate;
...
于 2013-08-22T11:47:31.183 回答
1

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

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;
于 2013-08-22T11:50:00.577 回答
0
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
于 2013-08-22T11:46:57.913 回答