【问题标题】:Datetime parameter format from Crystal Reports to SQL Server stored procedure从 Crystal Reports 到 SQL Server 存储过程的日期时间参数格式
【发布时间】:2018-05-06 23:20:57
【问题描述】:

我正在尝试使用需要两个 datetime 输入参数的 SQL Server 存储过程来创建报告。但是存储过程不接受在提示屏幕上选择的输入参数值,产生错误

'关键字 CONVERT 附近的语法不正确'。

报表生成的SQL默认使用Convert函数

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。

【问题讨论】:

    标签: sql-server tsql crystal-reports sql-server-2014


    【解决方案1】:

    将变量传递给存储过程时不能使用转换/转换函数,但是在将变量传递给proc之前声明变量,对变量进行转换/转换,然后将变量传递给proc,像这样:

    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 函数中的第三个参数(Style) 是多余的,DateTime 没有样式,它使用其标准格式(ticks) 在SQL Server 中存储数据。

    【讨论】:

    • 我正在使用 Crystal 报表来读取 SP。连接报表时会提示从日历中选择值。在执行时,报告会自动生成带有 CONVERT 的代码并生成错误。我看到的解决方法是创建一个字符串报告级别变量以将值传递给 SP 而不是直接用户输入
    • 你的笔记错了。第三个参数(样式)告诉 SQL Server 如何将字符串转换为日期时间。确实 datetime 没有显示格式(或样式),但它的字符串表示确实有样式。省略样式参数可能会导致错误或最坏的错误日期。 12/01/2017 是指 1 月 12 日还是 12 月 1 日?只有使用 style 参数,您才能告诉 SQL Server 是哪一个,在这种情况下,120 是错误的值。它应该是 101 或 103。
    【解决方案2】:

    在水晶报表中输入以下命令

    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
    

    你不需要转换

    【讨论】:

    • SP 根据时间戳过滤底层数据集。最终用户需要能够输入时间以查看某个时间点的记录。例如 - 获取今天下午 3 点之前的所有交易列表。我们无法从参数中删除时间元素。
    【解决方案3】:

    通过使用 SQL OLE DB Native Driver 而不是 SQL Server 的 Microsoft OLE DB 提供程序解决了该问题。 Crystal 报表现在不生成转换。

    【讨论】:

    • 你不需要转换
    【解决方案4】:

    按照以下步骤解决了问题。

    1.从链接MSOLEDBDRIVER安装“MS OLE DB驱动程序”。

    2.在存储过程中,将“DateTime”替换为“Date”作为输入参数。

    3.在Crystal Report中新建连接,选择->OLE DB->“Microsoft OLE DB Driver for SQL”作为提供者。在“高级信息”选项卡中,设置“DataTypeCompatibility”= 80.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多