日期:2014-05-18  浏览次数:20529 次

sql语句取得格式化的最大编号,如何写?
sql语句取得格式化的最大编号,如何写?
例如  
数据库中最大编号0501 则生成0502
数据库中最大编号9999 则生成10000

select right('0000000000000000000000' + cast(max(bh)+1 as varchar),len(max(bh))) as maxbh from spxx
这个语句有一个问题
当max(bh)=9999的时候, 取得的结果就变成0000了
现在就是要解决这个问题
如果这样写
select right('0000000000000000000000' + cast(max(bh)+1 as varchar),len(cast((max(bh)+1) as varchar))) as maxbh from spxx
虽然解决了9999的问题,但如果max(bh)=0501时,结果又生成了502

------解决方案--------------------
探讨
sql语句取得格式化的最大编号,如何写?
例如
数据库中最大编号0501 则生成0502
数据库中最大编号9999 则生成10000

select right('0000000000000000000000' + cast(max(bh)+1 as varchar),len(max(bh))) as maxbh from spxx
这个语句有一个问题
当max(bh)=99……

------解决方案--------------------
SQL code

go
create table #spxx(
bh int 
)
insert #spxx
select 9999
select case when max(bh)=9999 then right('0000000000000000000000' + 
ltrim(max(bh)+1),len(ltrim(max(bh)))+1) else
right('0000000000000000000000' + 
ltrim(max(bh)+1),len(ltrim(max(bh)))) end
 as maxbh from #spxx
 /*
 maxbh
10000
 */

------解决方案--------------------
写了个例子,自动根据最大的编号进行判断和调整,仅供参考:
create table t1
(
id varchar(10)
)
insert into t1
select '99999'

select * from t1
select MAX(CAST(id as int)) from t1

select case when len(MAX(CAST(id as int))+1)>len(MAX(CAST(id as int))) 
then RIGHT('0000000000'+LTRIM(MAX(CAST(id as int))+1),len(MAX(CAST(id as int))+1))
else RIGHT('0000000000'+LTRIM(MAX(CAST(id as int))+1),LEN(max(cast(id as int))))
end
from t1

------解决方案--------------------
另外说一句,楼主你这种编号,每次都要转换数据类型,实在是麻烦的很。
------解决方案--------------------
楼主这样子很难确定吧!最好是指定长度,对于流水号而言,给个设置的规律。

例如字符串总共十五位,前五位是各公司设置的字母前缀,后十位是序号。这样截取应该容易点。