我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。

我想用前导零填充它,所以如果它的原始值是“1”,那么新值将是“001”。或者如果它的原始值是“23”,那么新的值是“023”。或者如果它的原始值为124,则新值与原始值相同。

我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?


当前回答

安全方法:

SELECT REPLACE(STR(n,3),' ','0')

这样做的好处是,对于n < 0或n > 999返回字符串'***',这是一个很好的、很明显的越界输入指示器。这里列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败。

其他回答

当我需要固定大小的varchar(或字符串)输出时,我用整数列作为输入有类似的问题。例如,1到'01',12到'12'。这段代码工作:

SELECT RIGHT(CONCAT('00',field::text),2)

如果输入也是varchar的列,则可以避免强制转换部分。

安全方法:

SELECT REPLACE(STR(n,3),' ','0')

这样做的好处是,对于n < 0或n > 999返回字符串'***',这是一个很好的、很明显的越界输入指示器。这里列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败。

虽然这个问题是针对SQL Server 2008 R2的,但如果有人阅读的是2012或更高版本的SQL Server,从那时起,使用FORMAT就变得简单多了。

您可以传递一个标准的数字格式字符串或自定义的数字格式字符串作为format参数(感谢Vadim Ovchinnikov提供的提示)。

对于这个问题,比如一个代码

DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

输出

001
001

要获得更动态的方法,请尝试以下方法。

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)

如果字段已经是一个字符串,这将起作用

 SELECT RIGHT('000'+ISNULL(field,''),3)

如果你想让null值显示为000

它可能是一个整数,然后你会想

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

根据问题的要求,这个答案只在长度<= 3时有效,如果你想要更大的东西,你需要改变字符串常数和两个整数常数为所需的宽度。例如“0000”和VARCHAR(4)),4