如果您可以更改表定义(*),则保持基本值完全是数字并仅格式化为这些字符串会更容易:
create table T (
CoreValue int not null,
DisplayValue as CONVERT(varchar(10),(CoreValue / 26)+1) + CHAR(ASCII('A') + (CoreValue-1) % 26)
)
go
insert into T (CoreValue)
select ROW_NUMBER() OVER (ORDER BY so1.object_id)
from sys.objects so1,sys.objects so2
go
select * from T
结果:
CoreValue DisplayValue
----------- ------------
1 1A
2 1B
3 1C
4 1D
5 1E
6 1F
....
22 1V
23 1W
24 1X
25 1Y
26 2Z
27 2A
28 2B
29 2C
....
9593 369Y
9594 370Z
9595 370A
9596 370B
9597 370C
9598 370D
9599 370E
9600 370F
9601 370G
9602 370H
9603 370I
9604 370J
所以插入一个新值就像从列中取出并加1一样简单MAX
(假设可序列化隔离或类似,以处理多个用户)
(*) 即使你不能改变你的表定义——我仍然会生成这个表。然后,您可以将其连接到原始表,并可以使用它对列执行简单MAX
的操作int
,然后添加一个并查找下一个要使用的字母数字值。只需使用您期望使用的尽可能多的值填充它。