【发布时间】:2020-01-15 01:29:55
【问题描述】:
问题:我有来自数据仓库的大型表,其中课程编号存储为nvarchar(20)。
在过去的 50 年中,这些课程编号都是 8 位数字,包括许多前导零来表示较低的数字。
但是现在,我们的云提供商决定使用 10 位数的课程编号进行操作 云提供商不认为具有前导零的数值等效值是等效的。他们使用严格的字符串逻辑。但 SQL Server 2008 似乎试图通过将数字字符串当作数字来处理,从而对我“有利”。
如果我查询一个没有 WHERE 子句的表,我只会得到 8 位(8 个字符)的记录。
10 位(10 个字符)CourseNbr 的记录已消失。 但如果我明确要求记录 WHERE (LEN([CourseNbr]) = 10),它会返回近 200 条缺失的记录。这似乎是无法容忍的。我怎么能以这种方式做生意?迁移到新的 SQL Server 2017 服务器。也许这个异常会消失?
@@VERSION = Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
编辑:我将表 [CourseNbr] 的本地副本中的存储类型从 nvarchar(20) 更改为 varchar(10),现在出现了 10 位字符串/数字!我可以搜索 10 个字符/数字的记录,它们看起来不错。我回答了我自己的问题吗?为什么会有所作为?
【问题讨论】:
-
请提供一个最小可重现的例子来证明这个问题。没有
where子句的select语句总是返回表中的所有行。 -
无论 SQL Server 2017 或 2019 是否会解决“问题”(很可能不会),您都应该升级,因为您的当前版本已完全不受支持 6 个月。跨度>
-
谢谢,@GMB。我尝试制作一个测试表,它按我们的预期工作,它返回所有包含 8 个字符和 10 个字符 CourseNbr 的行。我的 RealWorld 表包含 54083 行。还在调查中.....
-
谢谢@alroc。是的,我同意 SWL 2008 早已过时。但我无法控制他们运行的版本。这就是我将所有 35 个数据库迁移到带有 SQL 2017(2019 尚未批准使用)的新服务器的原因之一
标签: sql-server sql-server-2008-r2