Excel 用户在从视图刷新数据时从 SQL 服务器收到转换错误
Excel user getting conversion error from SQL Server when refreshing data from view
(已编辑 - 添加了数据类型和语言信息)
我为员工创建了视图 Foo2
。每当他尝试刷新数据时,都会出现错误:
[DataSource.Error] Microsoft SQL Server: the conversion of a varchar data type to a smalldatetime data type resulted in an out-of-range value.
当我(系统管理员角色)尝试刷新 Excel sheet 中的数据时,一切顺利,SSMS 中的查询不会抛出任何错误。用户还使用另一个视图 Foo1
- Foo2
的先前版本。那一个按预期工作。
现在我在这一点上:
- 我将
Foo1
和 Foo2
中的 SELECT
语句更改为完全相同
- 视图在同一个数据库和架构中
- 员工作为 windows 登录组的成员访问服务器和数据库
- 视图属性 windows 相同,除了
Foo1
视图中的两个扩展属性 - MS_DiagramPane1 和 MS_DiagramPaneCount(不知道它们是什么)
语言和数据类型相关信息:
- 视图的整理相同(
SQL_Slovak_CP1250_CI_AS
)
- 两个
LOGIN
的语言相同 (Slovak - slovenčina
)
- 两个
USER
的排序规则相同 (SQL_Slovak_CP1250_CI_AS
)
- 我们都有 MS 365 的斯洛伐克语版本
- 视图中未发生
CAST
、CONVERT
或其他数据类型更改
Foo1
和Foo2
的数据类型相同
我怀疑用户组获得了对该特定视图的许可 Foo1
,但我不知道如何检验这一理论。
- SQL 服务器 2019 (v15.0.2000.5)
- Excel 版本:Microsoft 365 企业版
所以问题出在他 SELECT
语句的 WHERE
部分。
SELECT
clmn1
,clmn2
,clmn3
FROM table1
WHERE clmn1 > '2017-12-31'
列 clmn1
是数据类型 smalldatetime
。我仍然不明白原因,因为从 varchar
到 smalldatetime
的隐式转换应该是可能的。至少根据这里的图表:
在 WHERE
子句中使用 CONVERT
后,SELECT
语句按预期工作:
SELECT
clmn1
,clmn2
,clmn3
FROM table1
WHERE clmn1 > CONVERT(smalldatetime, '2017-12-31 23:59:59', 120)
我想我漏掉了什么。无论如何 - 问题解决了。
(已编辑 - 添加了数据类型和语言信息)
我为员工创建了视图 Foo2
。每当他尝试刷新数据时,都会出现错误:
[DataSource.Error] Microsoft SQL Server: the conversion of a varchar data type to a smalldatetime data type resulted in an out-of-range value.
当我(系统管理员角色)尝试刷新 Excel sheet 中的数据时,一切顺利,SSMS 中的查询不会抛出任何错误。用户还使用另一个视图 Foo1
- Foo2
的先前版本。那一个按预期工作。
现在我在这一点上:
- 我将
Foo1
和Foo2
中的SELECT
语句更改为完全相同 - 视图在同一个数据库和架构中
- 员工作为 windows 登录组的成员访问服务器和数据库
- 视图属性 windows 相同,除了
Foo1
视图中的两个扩展属性 - MS_DiagramPane1 和 MS_DiagramPaneCount(不知道它们是什么)
语言和数据类型相关信息:
- 视图的整理相同(
SQL_Slovak_CP1250_CI_AS
) - 两个
LOGIN
的语言相同 (Slovak - slovenčina
) - 两个
USER
的排序规则相同 (SQL_Slovak_CP1250_CI_AS
) - 我们都有 MS 365 的斯洛伐克语版本
- 视图中未发生
CAST
、CONVERT
或其他数据类型更改 Foo1
和Foo2
的数据类型相同
我怀疑用户组获得了对该特定视图的许可 Foo1
,但我不知道如何检验这一理论。
- SQL 服务器 2019 (v15.0.2000.5)
- Excel 版本:Microsoft 365 企业版
所以问题出在他 SELECT
语句的 WHERE
部分。
SELECT
clmn1
,clmn2
,clmn3
FROM table1
WHERE clmn1 > '2017-12-31'
列 clmn1
是数据类型 smalldatetime
。我仍然不明白原因,因为从 varchar
到 smalldatetime
的隐式转换应该是可能的。至少根据这里的图表:
在 WHERE
子句中使用 CONVERT
后,SELECT
语句按预期工作:
SELECT
clmn1
,clmn2
,clmn3
FROM table1
WHERE clmn1 > CONVERT(smalldatetime, '2017-12-31 23:59:59', 120)
我想我漏掉了什么。无论如何 - 问题解决了。