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
的先前版本。那个按预期工作。
现在我在这一点上:
我将Foo1
和Foo2
中的SELECT
语句更改为完全相同
视图位于相同的数据库和架构中
员工作为 Windows 登录组的成员访问服务器和数据库
除了Foo1
视图中的两个扩展属性——MS_DiagramPane1 和 MS_DiagramPaneCount(不知道它们是什么)之外,视图属性窗口是相同的
语言和数据类型相关信息:
视图排序相同 (SQL_Slovak_CP1250_CI_AS
)
LOGIN
s 的语言相同 (Slovak - slovenčina
)
USER
s 的排序规则相同 (SQL_Slovak_CP1250_CI_AS
)
我们都有斯洛伐克语版本的 MS 365
视图中未发生CAST
、CONVERT
或其他数据类型更改
Foo1
和 Foo2
中的数据类型相同
我怀疑用户组被授予了对该特定视图Foo1
的权限,但我不知道如何测试这个理论。
【问题讨论】:
不同的LOGIN
s 有不同的语言设置吗?
旁注:为什么仍在运行 RTM 版本的 SQL Server 2019?初始版本有多个错误修复(这在初始版本中非常普遍)和几个您不是补丁的安全修复。过去 2 年您对应用更新有何反对?
显然设置不匹配,可能是language
或dateformat
。临时解决方案是使用固定的style
进行转换(不知道是哪个,因为您没有给我们数据)。我强烈建议您首先调查一下为什么要转换值,您应该始终以正确的数据类型存储数据。
LOGIN
s 和 USER
s 的语言设置相同
您能否详细说明language
和dateformat
中的不匹配?所有日期时间列都存储为相同的数据类型相同 - smalldatetime
。
【参考方案1】:
所以问题出在SELECT
语句中的WHERE
部分。
SELECT
clmn1
,clmn2
,clmn3
FROM table1
WHERE clmn1 > '2017-12-31'
列clmn1
是数据类型smalldatetime
。我仍然不明白原因,因为从varchar
到smalldatetime
的隐式转换应该是可能的。至少根据这里的图表:
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 收到转换错误的主要内容,如果未能解决你的问题,请参考以下文章