Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Sql server 用前导零填充字符串,不适用于1个字符的传入字符串。_Sql Server_String_Tsql - Fatal编程技术网

Sql server 用前导零填充字符串,不适用于1个字符的传入字符串。

Sql server 用前导零填充字符串,不适用于1个字符的传入字符串。,sql-server,string,tsql,Sql Server,String,Tsql,我试图用前导零填充字符串的前面,使其长度为8个字符。我写了一个小东西: DECLARE @pn VARCHAR(8) = '123' SELECT RIGHT(REPLICATE('0', 8 - LEN(@pn)) + @pn, @pn) 它工作正常,除非字符串长度只有一个字符,或者字符串中没有字符。我想,如果字符串的长度为0,我有点希望发生这种情况,但无法确切解释原因。但是,我不知道如果传入的字符串是1个字符,为什么它不起作用。因此,我正在寻找一些关于如何处理1个字符的传入字符串的帮助 谢

我试图用前导零填充字符串的前面,使其长度为8个字符。我写了一个小东西:

DECLARE @pn VARCHAR(8) = '123'
SELECT RIGHT(REPLICATE('0', 8 - LEN(@pn)) + @pn, @pn)
它工作正常,除非字符串长度只有一个字符,或者字符串中没有字符。我想,如果字符串的长度为0,我有点希望发生这种情况,但无法确切解释原因。但是,我不知道如果传入的字符串是1个字符,为什么它不起作用。因此,我正在寻找一些关于如何处理1个字符的传入字符串的帮助


谢谢

您正在使用@pn作为右()的切割长度

更进一步说,如果使用RIGHT(),则不需要在@pn上计算长度:

SELECT RIGHT(REPLICATE('0', 8) + @pn, 8)
甚至

SELECT RIGHT('000000000' + @pn, 8)

如果是2012+,则可以使用格式()

功能性很好,但不知道是一个高性能

还假设@pn仅为数字(无alpha)

示例

DECLARE @pn VARCHAR(8) = '123'
SELECT format(0+@pn,'00000000')
返回

00000123

是的,看起来主要的问题是使用@pn作为右边的参数

另外,为了补充John的解释,我会抛出一个LTRIM,或者如果@pn前面有空格,它将被添加到任一解决方案中

所以 选择右侧(复制('0',8)+LTRIM(@pn),8)

使用Len()函数需要注意的事项:Len的行为就像它内置了一个隐式RTRIM

DECLARE @d Char(8) = '1    '   
 select len (@d)               -- Will return 1
 Select @d = '   1'
 select len (@d)               -- Will Return 4

右侧(复制('0',8)+@pn,8)
。我不知道你为什么认为将
@pn
作为
RIGHT
的第二个参数传递是有意义的,但它显然没有意义。对不起,我正在尝试学习这些东西,我猜在玩这个的过程中,我对不同的参数有点困惑,没有意识到我犯的错误。太棒了,谢谢你的解释。我有时会把自己弄糊涂,弄不懂如何处理字符串。。我对SQL还是相当陌生:)太棒了,谢谢你,我也尝试过这个解决方案。另一个被标记为已接受的唯一原因是,我最终使用的是该表,而我最后使用的表上的数据类型不适用于此解决方案,但我现在正在其他地方做类似的事情。感谢您的建议和解释谢谢,我使用了format,因为当我在实际选择的表中使用它时,数据类型是format可以处理的,而其他解决方案不能。
DECLARE @d Char(8) = '1    '   
 select len (@d)               -- Will return 1
 Select @d = '   1'
 select len (@d)               -- Will Return 4