我正在尝试使用需要两个datetime
输入参数的 SQL Server 存储过程创建报表。但是,存储过程不接受在提示屏幕上选择的输入参数值,从而生成错误
"关键字转换附近的语法不正确"。
报表生成的SQL默认使用转换功能
EXECUTE [Projects_findings_summary_date]
CONVERT (DATETIME, '12/01/2017 00:00:00', 120),
CONVERT (DATETIME, '12/31/2017 12:59:59', 120)
GO
此代码也在 SQL Server Management Studio 中生成了错误。但是如果我们去掉CONVERT
函数,它可以正常工作。
EXECUTE [Projects_findings_summary_date]
'12/01/2017 00:00:00',
'12/31/2017 12:59:59'
GO
任何解决此问题的帮助将不胜感激。
我们最近升级到 Crystal Reports 2016 和 SQL Server 2014。
将变量传递给存储过程时不能使用转换/强制转换函数,但是在将变量传递给过程之前声明变量,对变量进行转换/强制转换,然后将变量传递给过程,如下所示:
Declare @FromDate DATETIME = CONVERT (Datetime,'12/01/2017 00:00:00', 120)
, @ToDate DATETIME = CONVERT (Datetime,'12/31/2017 12:59:59', 120);
EXECUTE [Projects_findings_summary_date] @FromDate
, @ToDate
GO
注意
将字符串转换为DateTime
值时,CONVERT
函数中的第三个参数(样式)是多余的,DateTime 没有样式,它使用其标准格式(刻度)将数据存储在 SQL Server 中。
IN 水晶报告为命令键入以下内容
declare @datefrom as datetime = {?datefrom} -- parameter in CR
declare @dateto as datetime = {?dateto} -- parameter in CR
EXECUTE [Projects_findings_summary_date] @datefrom, @dateto
--@datefrom and @dateto are datetime variables
您无需转换
通过使用 SQL OLE DB 本机驱动程序而不是 SQL Server 的 OLE DB 提供程序Microsoft解决了此问题。转换现在不是由水晶报告生成的。
按照以下步骤解决了问题。
1.从链接安装"MS OLE DB 驱动程序"。
2.In 存储过程中,将输入参数的"日期时间"替换为"日期"。
3.In"晶体报告"中,建立新连接,选择"->OLE DB->"Microsoft OLE DB 驱动程序 对于 SQL"作为提供者。在"高级信息"选项卡中,设置"数据类型兼容性" = 80.