Excel 用户在从视图中刷新数据时从 SQL Server 收到转换错误

Posted

技术标签:

【中文标题】Excel 用户在从视图中刷新数据时从 SQL Server 收到转换错误【英文标题】:Excel user getting conversion error from SQL Server when refreshing data from view 【发布时间】:2022-01-22 03:37:01 【问题描述】:

(已编辑 - 添加了数据类型和语言信息)

我为员工创建了一个视图 Foo2。每当他尝试刷新数据时,都会出现错误:

[DataSource.Error] Microsoft SQL Server:将 varchar 数据类型转换为 smalldatetime 数据类型导致值超出范围。

当我(系统管理员角色)尝试刷新 Excel 工作表中的数据时,一切顺利,SSMS 中的查询不会引发任何错误。用户还使用另一个视图Foo1 - Foo2 的先前版本。那个按预期工作。

现在我在这一点上:

我将Foo1Foo2 中的SELECT 语句更改为完全相同 视图位于相同的数据库和架构中 员工作为 Windows 登录组的成员访问服务器和数据库 除了Foo1 视图中的两个扩展属性——MS_DiagramPane1 和 MS_DiagramPaneCount(不知道它们是什么)之外,视图属性窗口是相同的

语言和数据类型相关信息:

视图排序相同 (SQL_Slovak_CP1250_CI_AS) LOGINs 的语言相同 (Slovak - slovenčina) USERs 的排序规则相同 (SQL_Slovak_CP1250_CI_AS) 我们都有斯洛伐克语版本的 MS 365 视图中未发生CASTCONVERT 或其他数据类型更改 Foo1Foo2 中的数据类型相同

我怀疑用户组被授予了对该特定视图Foo1 的权限,但我不知道如何测试这个理论。

SQL Server 2019 (v15.0.2000.5) Excel 版本:Microsoft 365 企业版

【问题讨论】:

不同的LOGINs 有不同的语言设置吗? 旁注:为什么仍在运行 RTM 版本的 SQL Server 2019?初始版本有多个错误修复(这在初始版本中非常普遍)和几个您不是补丁的安全修复。过去 2 年您对应用更新有何反对? 显然设置不匹配,可能是languagedateformat。临时解决方案是使用固定的style 进行转换(不知道是哪个,因为您没有给我们数据)。我强烈建议您首先调查一下为什么要转换值,您应该始终以正确的数据类型存储数据。 LOGINs 和 USERs 的语言设置相同 您能否详细说明languagedateformat 中的不匹配?所有日期时间列都存储为相同的数据类型相同 - smalldatetime 【参考方案1】:

所以问题出在SELECT 语句中的WHERE 部分。

SELECT
    clmn1
    ,clmn2
    ,clmn3
FROM table1
WHERE clmn1 > '2017-12-31'

clmn1 是数据类型smalldatetime。我仍然不明白原因,因为从varcharsmalldatetime 的隐式转换应该是可能的。至少根据这里的图表:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-ver15

WHERE 子句中使用CONVERT 后,SELECT 语句可以正常工作:

SELECT
    clmn1
    ,clmn2
    ,clmn3
FROM table1
WHERE clmn1 > CONVERT(smalldatetime, '2017-12-31 23:59:59', 120)

我想我错过了一些东西。无论如何 - 问题解决了。

【讨论】:

以上是关于Excel 用户在从视图中刷新数据时从 SQL Server 收到转换错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试自动刷新当前页面视图时从ViewPager获取下一页面视图

更新SQL适配器后保留Datagrid视图的排序顺序

如何刷新数据透视图

填充时从集合视图中选择一个单元格

Oracle SQL 面试关于物化视图的问题?

Oracle SQL 到 Excel - 集成