Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL Server零填充_Sql_Sql Server_Stored Procedures_Sql Server 2012 - Fatal编程技术网

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
类型。将列更改为a
VARCHAR(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')