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

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

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


当前回答

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

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

其他回答

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

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

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

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

我创建了这个函数,它满足bigint和一个前导零或其他单个字符(最多返回20个字符),并允许结果长度小于输入数字的长度:

create FUNCTION fnPadNum (
  @Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Pads bigint with leading 0's
            --Sample:  "select dbo.fnPadNum(201,5,'0')" returns "00201"
            --Sample:  "select dbo.fnPadNum(201,5,'*')" returns "**201"
            --Sample:  "select dbo.fnPadNum(201,5,' ')" returns "  201"
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Usage:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')

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

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 

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

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

安全方法:

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

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