【问题标题】:SQL is removing leading zerosSQL 正在删除前导零
【发布时间】: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


【解决方案1】:

你可以试试这个

  1. 返回不带前导零的 varchar
    SELECT CONVERT(varchar(20), CONVERT(int, [CourseNbr])) as CourseNbrWithNoLeadingZeros
    FROM CourseNbrTable
  1. 返回不带前导零的 int
    SELECT CONVERT(int, [CourseNbr]) as CourseNbrWithNoLeadingZeros
    FROM CourseNbrTable

【讨论】:

  • 谢谢@Mohammed。我可能没有说清楚。我需要前导零才能与公司/云系统交互。我不希望 SQL 将我的数字存储为字符串。我需要保持前导零不变。
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多