我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。
我想用前导零填充它,所以如果它的原始值是“1”,那么新值将是“001”。或者如果它的原始值是“23”,那么新的值是“023”。或者如果它的原始值为124,则新值与原始值相同。
我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?
我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。
我想用前导零填充它,所以如果它的原始值是“1”,那么新值将是“001”。或者如果它的原始值是“23”,那么新的值是“023”。或者如果它的原始值为124,则新值与原始值相同。
我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?
当前回答
我创建了这个函数,它满足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,' ')
其他回答
对于那些想要更新现有数据的人,这里是查询:
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
安全方法:
SELECT REPLACE(STR(n,3),' ','0')
这样做的好处是,对于n < 0或n > 999返回字符串'***',这是一个很好的、很明显的越界输入指示器。这里列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败。
下面是一个更通用的左填充到任何所需宽度的技巧:
declare @x int = 123 -- value to be padded
declare @width int = 25 -- desired width
declare @pad char(1) = '0' -- pad character
select right_justified = COALESCE(replicate(
@pad ,
@width-len(convert(varchar(100),@x))
), '')
+ convert(varchar(100),@x)
但是,如果处理的是负值,并且填充前导为0,那么这种方法和其他建议的技术都不起作用。你会得到这样的结果:
00-123
[可能不是你想要的]
下面是一种正确格式化负数的方法:
declare @x float = -1.234
declare @width int = 20
declare @pad char(1) = '0'
select right_justified = stuff(
convert(varchar(99),@x) , -- source string (converted from numeric value)
case when @x < 0 then 2 else 1 end , -- insert position
0 , -- count of characters to remove from source string
replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
)
应该注意,convert()调用应该指定一个[n]varchar,该varchar有足够的长度来保存经过截断的转换结果。
我知道这是一张旧票,但我想分享这个:
我发现这个代码提供了一个解决方案。不确定它是否适用于所有版本的MSSQL;我有MSSQL 2016。
declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero
这将返回“0023”。
STR函数中的4是总长度,包括值。例如,4、23和123在STR中都有4,并且将添加正确数量的零。你可以增加或减少它。不需要知道23号的长度。
编辑:我看到这和@Anon的帖子是一样的。
虽然这个问题是针对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