- 我正在使用SQL Server 2012。
我正在更新表中名为PostNumber的列以放置前导零。它的数据类型是 nvarchar(50(。它应该始终是 6 位数字。如果不是六,则应用前导零填充。我尝试过使用以下 T-SQL:
update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)
初始表1为:
Id PostNumber
1 234
2 24545
3 435434
我们需要做什么:
Id PostNumber
1 000234
2 024545
3 435434
非常奇怪的是,它不适用于以前的 T-SQL!除非我们明确设置 Id..
update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)
where Id between 1 and 3
最后一个T-SQL工作,但我不知道为什么以前的T-SQL不起作用!该表保持不变,根本不放置任何零。你能提供一个可能的原因吗?谢谢。 我真的需要在不明确 ID 的情况下进行批量更新。
您的实际问题
如果列PostNumber
为数值类型,则值123
将与值000123
相同。前导零是字符串类型的问题,或者 - 在大多数情况下,您只需要在表示层中提供某些内容。
更新 没有仔细阅读...
在您声明的评论中,该专栏是一个nvarchar(50)
可能是,你的值周围有空白,试试这个:
set PostNumber=RIGHT('000000'+ISNULL(LTRIM(RTRIM(PostNumber)),''),6)
检查与
SELECT PostNumber,LEN(PostNumber),DATALENGTH(PostNumber) FROM ...
填充方法
有几种方法,我更喜欢REPLACE
的方法STR
DECLARE @number INT=34;
SELECT REPLACE(STR(@number,6),' ','0')
RIGHT
非常常见的方法的问题在于,如果数字超过位数,它将返回不良结果。
DECLARE @number6 INT=123456;
SELECT REPLACE(STR(@number6,6),' ','0')
,RIGHT('000000'+ISNULL(@number6,''),6);
DECLARE @number7 INT=1234567;
SELECT REPLACE(STR(@number7,6),' ','0')
,RIGHT('000000'+ISNULL(@number7,''),6);
老实说:我最喜欢的方法有一个缺点,即负数:
DECLARE @numberMinus INT=-15;
SELECT REPLACE(STR(@numberMinus,6),' ','0')
,RIGHT('000000'+ISNULL(@numberMinus,''),6);
从 SQL-Server 2012 开始,有FORMAT()
SELECT FORMAT(@number,'000000')
不是最好的表演者,但效果很好。