Sql server 用前导零填充字符串,不适用于1个字符的传入字符串。
我试图用前导零填充字符串的前面,使其长度为8个字符。我写了一个小东西: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个字符的传入字符串的帮助 谢
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