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

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

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


当前回答

下面是我在SQL Server Express 2012中使用的Hogan回答的一个变体:

SELECT RIGHT(CONCAT('000', field), 3)

而不是担心字段是否是字符串,我只是CONCAT它,因为它无论如何都会输出一个字符串。此外,如果字段可以为NULL,则可能需要使用ISNULL来避免函数得到NULL结果。

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 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

对于整数,你可以使用从int到varchar的隐式转换:

SELECT RIGHT(1000 + field, 3)

最后我决定用这个:

RIGHT(STUFF(ReceiptNum, 1, 0, replicate('0',10)),10)

用固定长度的方法试试。

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

我来这里是为了解决如何将我的timezoneoffset转换为一个时区字符串,以便在SQL Server 2008中将日期转换为DATETIMEOFFSET。很恶心,但很有必要。

所以我需要一个方法来处理负数和正数,如果需要,将它们格式化为两个字符,前导为零。Anons的回答让我接近了,但负时区值会显示为0-5而不是所需的-05

所以在他的答案上做了一点调整,这适用于所有时区小时转换

DECLARE @n INT = 13 -- Works with -13, -5, 0, 5, etc
SELECT CASE 
    WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0') 
    ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'