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

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

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


当前回答

我来这里是为了解决如何将我的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'

其他回答

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

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

我一直认为下面的方法非常有用。

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'

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

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

如果你想让null值显示为000

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

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

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

使用这个函数,它适合各种情况。

CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @NumStr VARCHAR(250)

    SET @NumStr = LTRIM(@input)

    IF(@pad > LEN(@NumStr))
        SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;

    RETURN @NumStr;
END

样例输出

SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016 

写这个是因为我有一个特定的长度要求(9)。 仅当输入需要填充时,才使用@pattern填充左侧。 应该总是返回@pattern中定义的长度。

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

1234年返回输入