SQL Server Reporting Services 中的 Oracle 日期格式异常

Oracle Date format exception in SQL Server Reporting Services

早些时候我的客户使用 SSRS 2008R2 和 Oracle 作为事务数据库。最近他们已经升级到 SSRS 2017,现在许多报告都抛出以下错误:

ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [AbnormalTermination:ReportProcessing], Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: An error has occurred during report processing. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Query execution failed for dataset 'Ds_Main'. ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-01830: date format picture ends before converting entire input string

仔细查看报告查询后,我注意到此错误适用于所有使用 oracle 函数 TO_DATE(<Date Value>) 且未使用日期格式的报告。例如:

To_date(:Date_Parameter) -> this syntax throws above mentioned error
To_Date(:Date_Parameter,’MM/DD/YYYY’) -> this syntax works perfectly

我愿意知道:

  1. 导致此问题的 SSRS 2017 与 SSRS 2008 R2 发生了什么变化,因为相同的报告在 SSRS 2008 R2 中按预期工作并且在 SSRS 2017 中抛出上述错误。
  2. 是否有任何建议可以在不更新大量报告的情况下解决此问题?

正在尝试找出问题

我认为该问题与 Visual Studio 升级无关。它与作为参数传递给 TO_DATE() 函数的日期格式有关。

基于Oracle / PLSQL: ORA-01830 Error Message的官方文档:

Cause: You tried to enter a date value, but the date entered did not match the date format.

In Oracle, the default date format is generally DD-MON-YYYY. If you try to enter a date value that does not comply with this format.

您似乎以 dd-MMM-yyyy 格式传递日期参数,现在它们以 MM/dd/yyyy.

格式传递

首先,检查区域设置或应用程序文化信息没有改变。


可能的解决方法

您可以使用多种方法解决此问题:

(1)处理参数日期格式

如果您不想编辑所有代码,那么强制参数数据字符串格式更容易,确保传递给 TO_DATE() 函数的所有参数都采用以下格式 (或尝试从 OS 区域设置更改默认日期格式):

dd-MMM-yyyy   example: 01-AUG-2019

(2) TO_DATE函数添加日期格式

如果您确定日期参数格式是固定的并且不会更改,那么您可以按照问题中提到的那样编辑代码:

To_Date(:Date_Parameter,’MM/DD/YYYY’)

(3) 将日期和格式作为参数传递

这也需要更改代码,但您会将日期和格式作为参数传递。

To_Date(:Date_Parameter,:DateFormat_Parameter)

您可以在下面找到其他方法link:

  • ORA-01830: date format picture ends before converting entire input string / Select sum where date query

更新 1 - 在多个报告中进行共同更改

在搜索时,我发现以下内容 link 提供了一种遍历报告并进行更改的方法。您只需将 To_Date(:Date_Parameter) 替换为 To_Date(:Date_Parameter,’MM/DD/YYYY’):


更新 2 - 其他可能的解决方法

通过编辑强制文化信息 ReportViewer.aspx

您可以编辑位于 SQL 服务器报告服务目录中的 ReportViewer.aspx 文件,并强制在报告中使用区域性信息。查看以下问题,它将为您提供更多详细信息:

  • I want Datetime Parameter in DDMMYYYY Format in ssrs report

更改浏览器语言设置

检查以下 link (阅读 Mike Honey 和 Nick St Mags 的回答)


更新 3 - 问题原因

除了 @DavidBrownie 发布的内容外,我还找到了 SQL Server 2008 R2 文档:

他们提到的地方:

This built-in data source type is based on the .NET Framework Managed Provider for Oracle and requires an Oracle client software component.

此外,如果您查看 SQL Server 2017 文档:

This built-in data source type uses the Oracle Data Provider directly and requires an Oracle client software component.

此外,参考Microsoft OLE DB Provider for Oracle documentation (这是旧使用的提供商)。他们提到:

This feature will be removed in a future version of Windows. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Instead, use Oracle's OLE DB provider.

这就是更改用于在 Reporting Services 中连接到 Oracle 的提供程序的原因。

what has changed in SSRS2017 vs SSRS2008R2

SSRS 2008 使用 System.Data.OracleClient。在 SSRS 2016 及更高版本中,您必须安装由 Oracle 构建和支持的 Oracle ODP.NET 提供程序。所以可能只是两个驱动程序设置 NLS_DATE_FORMAT 会话参数的方式不同。

如果您使用以下查询将数据集添加到报告中,您可以看到您的设置:

select parameter, value 
from nls_session_parameters 
where parameter like 'NLS%'
order by parameter

遗憾的是,在 Oracle.ManagedDataAccess 中似乎没有全局更改客户端日期格式的方法,因此您必须在报表数据集查询中进行所有更改。

或者,您可以尝试确保传递的是日期参数而不是字符串参数。如果将日期传递给 Oracle 的 to_date() 函数,则无需指定格式。

SSRS 2014 的文档 "This built-in data source type is based on the .NET Framework Managed Provider for Oracle and requires an Oracle client software component."

并且 SSRS 2016 "This built-in data source type uses the Oracle Data Provider directly and requires an Oracle client software component."