昨天写一个存储过程时,有这样一个字符串 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
得到正确结果之后将问题给同事说,他也提供了一种类似的办法,似乎比我那个更简单
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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(原字符串,总长度,填充字符串),和第二种方法类似
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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新出来的吗?语言真是越做越简单了,简单到让人忘记思考。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-681753/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16436858/viewspace-681753/