MS SQL Server零填充
编辑:MS SQL Server零填充,sql,sql-server,stored-procedures,sql-server-2012,Sql,Sql Server,Stored Procedures,Sql Server 2012,编辑: 我正在将列数据类型更改为Varchar,如果建议有效,答案将被提升投票 完整故事: 我接收到一个人的数据,每个人都有一个5位数的临时号码,我处理这个信息,然后将变量发送到一个存储过程,该存储过程处理这个数据的插入。将变量发送到存储过程时,我似乎丢失了任何前缀0。 例如: 发送到存储过程的编号-实际插入列的编号 12345 - 12345 01234 - 1234 12340 - 12340 这似乎只发生在前面有0的数字上。意思是如果我收到: 00012它将作为12 是否有一
我正在将列数据类型更改为Varchar,如果建议有效,答案将被提升投票 完整故事: 我接收到一个人的数据,每个人都有一个5位数的临时号码,我处理这个信息,然后将变量发送到一个存储过程,该存储过程处理这个数据的插入。将变量发送到存储过程时,我似乎丢失了任何前缀0。
例如:
发送到存储过程的编号-实际插入列的编号
12345 - 12345
01234 - 1234
12340 - 12340
这似乎只发生在前面有0
的数字上。意思是如果我收到:00012
它将作为12
是否有一种方法可以将列更新为始终0
pad到左边一个固定的数字,这意味着如果我们得到12
,它将自动使值00012
或
在将变量插入到表中之前,存储过程接收到变量时,是否有办法对该变量执行此操作。 大致如下:
SET @zeroPaddedFixedNum = LeftPad(@numberRecieved, '0', 5);
此外,我现在需要停止插入和更新所有当前长度不正确的数字。有什么建议吗
也许只是我的Google功能失败了,但我已经尝试搜索了很多页面。为此,该列应为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
更新表
设置列=右('00000'+强制转换(列为varchar(5)),5)
在len(col)中,正如所指出的,您必须使用VARCHAR(5)
满足您的需要。。。但如果存储的值实际上是数字,我不会更改列类型。而是在将这些值传递给SP时使用以下选项之一(不过可以使用计算列或视图)
试一试
最大的优点是:如果您的数字超过5位,则返回****
。与其得到错误的号码,不如得到错误的号码。。。使用RIGHT()
的其他方法可能会意外地截断结果
对于SQL Server 2012,您应该使用FORMAT()
您要插入的列的类型是什么?听起来您存储的进程需要一个INT
,而您正在向它发送一个VARCHAR
,它正在被隐式转换。'01234'
的VARCHAR
值转换为1234
的INT
。你能用一些示例输入值发布存储过程的代码和对它的调用吗?这是一个开始,非常感谢你的回复。该数字被捕获为字符串并发送到存储过程。存储过程确实需要一个int值。列本身也是一个int值。您认为将列更新为varchar并将存储的proc变量更新为varchar会解决问题吗?如果需要,我可以添加insert语句。是的,如果希望存储像01234
这样的值,则不能使用INT
类型。将列更改为aVARCHAR(5)
,并按照下面的答案执行插入操作。@3N1GM4但是-如果这些值是数字-不应该更改类型,因为我需要一个特殊SP的特殊格式。而应该动态填充…这是一种危险的方法!想象一下一个超过5位数的数字。它将被截断,没有抱怨…是的,但OP希望将其格式化为5位,因此我的理解是,它的长度不会超过5位:)这种填充方法是您在这里经常会发现的。人们学会了:啊,这就是如何垫线的方法!然后跑进黑暗中。。。还有更好的方法,在本例中(SS2012),它是FORMAT()
我理解这个数字可能高于5位的问题,但生成和发送给我的数字的方式是从00000开始,直到99999,然后再次从0开始,因此它永远不会大于5位。Madhivanan,我已经将列更新为varchar,并将proc存储为varchar。我的最后一个问题你可能知道如何将所有小于5位的当前数字更新为零吗?因此,当前的值为:12 4123 582将为:00012 04123 00582是的,我同意。这是适用于所有版本的方法之一:)格式选项为great@Shnugo谢谢你花时间和精力回答问题,我将投赞成票。事实上,我确实同意你在回答中的逻辑,但正如回答中所述,“我理解这个数字可能高于5位数字的问题,但数字生成和发送给我的方式是从00000开始,直到99999,然后再从0开始,因此它永远不会超过5位。”如果这是第一个答案,我也会接受。但是,如果我收到一个varchar或int变量并插入它。select语句如何工作?@Jarryd只需在insert语句中包含FORMAT
:insert INTO SomeTbl(col1,col2,…)select FORMAT(YourNumber,5),OtherColumn。。。从某处
。数据类型非常重要!如果这些是数字,您应该有充分的理由不将它们视为数字……问题被标记为SQL Server 2012,因此FORMAT()
是正确的解决方案。
SELECT REPLACE(STR(YourNumber,5),' ','0');
SELECT FORMAT(YourNumber,'00000')