【问题标题】:MS SQL Server Zero PaddingMS SQL Server 零填充
【发布时间】:2016-12-09 09:22:54
【问题描述】:

编辑:
我将列数据类型更改为 Varchar,如果建议有效,答案将被投票赞成

全文: 我收到一个人的数据,每个人都有一个 5 位数长的相关临时号码,我处理此信息,然后将变量发送到处理此数据插入的存储过程。将变量发送到存储过程时,我似乎丢失了任何前缀 0。
例如:
发送到存储 Proc 的数字 - 实际插入列的数字

12345 - 12345  
01234 - 1234  
12340 - 12340  

这似乎只发生在前面带有0 的数字上。意思是如果我收到:
00012 它将插入为12

有没有一种方法可以将列更新为始终将0 向左填充一个固定数字,这意味着如果我们得到12,它将自动生成00012 的值。

在将变量插入表之前由存储过程接收到变量时,有没有办法对变量执行此操作。 大致如下:

SET @zeroPaddedFixedNum = LeftPad(@numberRecieved, '0', 5);  

此外,我现在需要停止插入更多数字并更新所有当前长度不正确的数字。有什么建议么?

也许只是我的谷歌能力失败了,但我尝试搜索了很多页面。

【问题讨论】:

  • 您要插入的列的类型是什么?听起来您的存储过程需要INT,而您正在向它发送VARCHAR,它正在被隐式转换。 VARCHAR 的值 '01234' 转换为 INT1234。您能否发布存储过程的代码以及您对它的调用以及一些示例输入值?
  • 这是一个开始,非常感谢您的回复。该数字被捕获为字符串并发送到存储过程。存储过程确实需要一个 int 值。列本身也是一个 int 值。您认为将列更新为 varchar,并将存储的 proc 变量更新为 varchar 会解决问题吗?如果需要,我可以添加插入语句。
  • 是的,如果你想存储像01234 这样的值,你不能使用INT 类型。将列更改为VARCHAR(5) 并按照下面Madhivanan 的答案执行INSERT
  • @3N1GM4 但是 - 如果这些值 数字 - 不应该更改类型,因为我需要一个特殊 SP 的特殊格式。而是动态填充...

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

为此,列应该是 varchar 数据类型。然后你就可以这样做了

Insert into table(col)
select right('00000'+cast(@var as varchar(5)),5)

编辑:更新现有数据

Update table
set col=right('00000'+cast(col as varchar(5)),5)
where len(col)<5

【讨论】:

  • 这是一种危险的方法!试想一个超过 5 位的数字。它将被截断而没有投诉...
  • 是的,但 OP 想要将其格式化为 5 位数字,所以我的理解是它的长度不会超过 5 位:)
  • 这种填充方法在 SO 上很常见。人们学习:啊,这就是如何填充字符串的方法!然后陷入黑暗......有更好的方法,在这种情况下(SS2012)它是FORMAT()
  • 我理解这个数字可能高于 5 位的担忧,但是数字的生成方式和发送给我的方式它们从 00000 开始直到 99999,然后再次从 0 开始,所以它永远不会更大超过 5 位数。 Madhivanan,我已将该列更新为 varchar,并将 proc 存储为 varchar。我的最后一个问题你可能知道如何将所有小于 5 位的当前数字更新为 LEFT 零填充?所以当前的值:12 4123 582 是:00012 04123 00582
  • 是的,我同意。这是适用于所有版本的方法之一 :)
【解决方案2】:

正如所指出的,您必须使用VARCHAR(5) 来满足您的需要...但如果存储的值实际上是数字,我不会更改列类型。每当您将这些值传递给您的 SP 时,请使用以下之一(尽管您可能使用计算列或 VIEW)。

试试

SELECT REPLACE(STR(YourNumber,5),' ','0');

最大的优势:如果您的号码超过 5 位,这将返回 *****。得到错误总比得到错误的数字要好...RIGHT() 的其他方法可能会意外地截断您的结果。

对于 SQL Server 2012,您应该使用 FORMAT()

SELECT FORMAT(YourNumber,'00000')

【讨论】:

  • 格式选项很棒
  • @Shnugo 感谢您花费时间和精力来回答,我会支持它。我实际上确实同意您在回答中的逻辑,但是正如回复中提到的那样“我理解这个数字可能高于 5 位的担忧,但是数字的生成方式和发送给我的方式从 00000 到 99999 然后开始再次为 0,因此它永远不会大于 5 位数。”如果这是第一个答案,我也会接受。但是,如果我收到一个 varchar 或 int 变量并且我正在插入它。 select 语句是如何工作的?
  • @Jarryd 只需在您的插入语句中包含FORMATINSERT INTO SomeTbl(col1,col2,...) SELECT FORMAT(YourNumber,5), OtherColumn, ... FROM SomeWhere数据类型非常重要!如果这些是数字,您应该有充分的理由不将它们视为数字...
  • 问题标记为 SQL Server 2012,因此FORMAT() 是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2014-07-01
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多