我试图用前导零填充字符串的前面,所以它是8个字符长。我写过这个小东西:
DECLARE @pn VARCHAR(8) = '123'
SELECT RIGHT(REPLICATE('0', 8 - LEN(@pn)) + @pn, @pn)
它工作正常,除非字符串的长度只有一个字符长,或者字符串中没有字符。我想如果字符串的长度为0,我会发生这种情况,但无法准确解释原因。但是,如果传入的字符串是1个字符,我不知道为什么它不起作用。所以我正在寻找一些如何处理1个字符传入字符串的帮助?
谢谢!
答案 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