【问题标题】:Weird SQL Server stored procedure behaviour - different results between asp.net and Management Studio奇怪的 SQL Server 存储过程行为 - asp.net 和 Management Studio 之间的不同结果
【发布时间】:2015-11-26 12:08:51
【问题描述】:

我们有一个用于填充 SSRS 报告的存储过程。这有点像怪物——大量的条件逻辑(在 case 语句中)、从 varchar 到 datetime 的强制转换(有时嵌入在其他强制转换中)以及依赖于调用包含一些日期函数的函数的 3 个字段。该报告包含一个组织的合同列表的财务信息。

我需要创建一个显示一个组织/合同的数据子集的 asp.net 页面,因此我克隆了存储过程并添加了一个合同参数。但是我注意到网页上依赖函数的 3 个字段的数字与直接在数据库上运行存储过程或通过报表运行存储过程时的数字不同。

为了解决问题,我创建了一个页面(使用SqlDataSourceDataGrid 快速而肮脏),它显示了显示所有合同的原始存储过程的结果。查询通过企业管理器运行良好,但网页因 YSOD 和消息而崩溃

将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。

我什至尝试将存储过程中的 SQL 硬编码到网页中,但仍然得到相同的结果

在我的开发机器上,原始存储过程运行,而我的新存储过程确实返回一致的结果,无论是通过网页还是通过 Management Studio 查看。开发服务器和实时服务器上的区域设置等相同。我能想到的唯一不同的是,实时网络服务器和数据库服务器位于不同的机器上。

以前有没有人遇到过这样的事情??

谢谢

【问题讨论】:

  • 使用与文化无关的ISO 8601。也可以尝试使用SET DATEFORMAT dmy;ymd
  • 如果可以,请在 ASP.net 应用程序中运行查询之前运行 SQL 分析器以获取正在执行的 SQL,听起来好像传递给存储过程的参数之一不是正确的类型.
  • 您是否使用与 ASP.NET 应用程序相同的用户帐户?文化与用户相关联。因此,应用程序用户可能会对您的用户使用不同的日期格式作为示例。这可以解释一些差异。

标签: sql asp.net sql-server stored-procedures


【解决方案1】:

感谢 lad2025 的修复和 Vanlightly 的原因:

我在存储过程的开头添加了以下语句,现在无论从哪里调用它,它都会返回一致的结果:

SET DATEFORMAT ymd;

Web 应用程序使用的 SQL 登录将其默认语言设置为 British English,而其他帐户设置为 English

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多