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

时间:2017-07-26 11:43:37

标签: sql-server string tsql

我试图用前导零填充字符串的前面,所以它是8个字符长。我写过这个小东西:

DECLARE @pn VARCHAR(8) = '123'
SELECT RIGHT(REPLICATE('0', 8 - LEN(@pn)) + @pn, @pn)

它工作正常,除非字符串的长度只有一个字符长,或者字符串中没有字符。我想如果字符串的长度为0,我会发生这种情况,但无法准确解释原因。但是,如果传入的字符串是1个字符,我不知道为什么它不起作用。所以我正在寻找一些如何处理1个字符传入字符串的帮助?

谢谢!

3 个答案:

答案 0 :(得分:1)

您使用@pn作为RIGHT()的剪切长度

DECLARE @pn VARCHAR(8) = '123'
SELECT RIGHT(REPLICATE('0', 8 - LEN(@pn)) + @pn, 8)

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

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

甚至

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

答案 1 :(得分:0)

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

功能强大,但不知道是一个高绩效者。

同样假设@pn只是数字(没有alpha)。

示例

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

<强>返回

00000123

答案 2 :(得分:0)

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

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

所以 选择右(复制(&#39; 0&#39;,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