SQL字符串的数字部分递增

本文探讨了在SQL中处理序列号自增的难题,通过巧妙的方法实现了字符串形式的序列号递增,如ZH#000001递增至ZH#001001。介绍了两种有效解决方案:一是通过添加前导‘1’并调整长度;二是使用lpad函数(或类似方法)进行前导零填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天写一个存储过程时,有这样一个字符串  ZH#000001,每次插入新的行时,数字部分需要+1,既 第1001次就是 ZH#001001。在实际写的过程中 select 'ZH#'+convert(varchar(20),('000001'+1))得到的结果是 ZH#2。原因是'000001'+1结果为2,转int型时去掉了前面的5个0。

 

因为第一次遇见这种情况,没有经验,开始直接想怎么判断它得到的结果少了几个0,然后将0补上,后来发现那样做非常复杂,大脑里的懒惰细胞发挥作用,绞尽妹汁的开始想有什么简单的办法可以解决。找了以前的几个类似情况,发现那些 XX#后面跟的是非0的数字开头,例如 ZJ#1003。


我就想着直接给'000001'先加个头,变成'1000001',这样再递增就可以得到想要的结果了。

declare @book_code varchar(50)

set @book_code=(select max(right('ZH#000001',6)) where 'ZH#000001' like 'ZH#%')

set @book_code='ZH#'+right(('1'+@book_code)+1,len('1'+@book_code)-1)

select @book_code

 


得到正确结果之后将问题给同事说,他也提供了一种类似的办法,似乎比我那个更简单

 

 

declare @book_code varchar(50)
set @book_code=(select max(right('ZH#000001',6)) where 'ZH#000001' like 'ZH#%')+1
set @book_code='ZH#'+right('000000'+@book_code,6)
select @book_code

 

 

在闪存中也有人提供了一种lpad(原字符串,总长度,填充字符串),和第二种方法类似

 

declare @book_code varchar(50)
set @book_code=(select max(right('ZH#000001',6)) where 'ZH#000001' like 'ZH#%')+1
set @book_code='ZH#'+lpad(@book_code,6,'0')
select @book_code

 

 

但2005似乎不支持这个函数,是2008新出来的吗?语言真是越做越简单了,简单到让人忘记思考。

转载于:https://www.cnblogs.com/21xz/archive/2010/12/14/1905188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值