Sql 如何求和+;1转换为包含数字部分的Varchar值?

Sql 如何求和+;1转换为包含数字部分的Varchar值?,sql,sql-server,azure,Sql,Sql Server,Azure,我有一个Varchar(9)列,它有一个代码来识别特定的案例,它不同于主键ID,因为这一个是在一些验证之后创建的,而且,代码不是按顺序创建的,我们可以在昨天6点创建一个案例,在8点创建另一个案例,在8点创建的案例的代码会比另一个先创建。所以,问题是每个代码都应该是最后一个代码+1,这并不难,但因为它包含非数值,我们必须检索最大值,但它不是真正有效的 例如: ID代码 1 AA0008-BX 2 AA0010-BX 3 AA0011-BX 4 AA0009-BX 因此,在这种情况下,我必须遍历这

我有一个
Varchar(9)
列,它有一个代码来识别特定的案例,它不同于主键ID,因为这一个是在一些验证之后创建的,而且,代码不是按顺序创建的,我们可以在昨天6点创建一个案例,在8点创建另一个案例,在8点创建的案例的代码会比另一个先创建。所以,问题是每个代码都应该是最后一个代码+1,这并不难,但因为它包含非数值,我们必须检索最大值,但它不是真正有效的

例如:

ID代码
1 AA0008-BX
2 AA0010-BX
3 AA0011-BX
4 AA0009-BX
因此,在这种情况下,我必须遍历这4个值,检索“AA0011-BX”作为最大值,将1添加到数字部分,使其成为“AA0012-BX”,并且,我必须添加数字字符所需的零的数量。因为它的末尾有AA和-BX部分,所以我们可以使用max(代码)并检索最大的,但是这是一个包含数千条记录的表,速度很慢,我想知道什么是最好的选择


您将如何使用代码来实现这一点,以使其真正快速?TIA

如果您使用的是SQL Server 2017或更高版本,则可以使用
TRIM
来实现所需的结果

请尝试以下操作:

declare @tab table (ID int, val varchar(10))

insert into @tab select 1, 'AA0008-BX'
insert into @tab select 2, 'BA0010-BX'
insert into @tab select 3, 'XA0011-BX'
insert into @tab select 4, 'AY0009-BX'

select TOP 1 REPLACE(VAL, TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)), TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL))+1 )
from @tab
ORDER BY TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)) DESC

假设格式始终是2个字母、4个数字、一个破折号,然后是2个字母,正如问题下的注释中所指定的那样,您可以简单地使用如下函数:

declare @next int
select @next = max(cast(substring(code,3,4) as int))+1 from table1
insert into table1 values ('AA'+right('0000'+cast(@next as varchar(4)),4)+'-BX')

对每种类型的代码使用一个序列“我们必须检索最大值,但它不是真正有效的”,并且很可能是不正确的,除非您在该操作期间完全阻止对表的写入Bligatory schema相关注释:如果这种情况可能再次发生,您可能需要重新考虑该模式,然后将
code
的组件存储在单独的列中,并根据各部分的值将
code
作为一个计算列。@a_horse_没有名字我们使用Microsoft SQL Server,我知道如果两个人同时使用它,或者如果有人也在添加新记录,总是检索最大数量的问题,如果你能帮忙的话,那就太好了,我们有一些方法来限制它,但不是在数据库本身。格式总是2个字母,4个数字,一个破折号,然后2个字母吗?@DavidBuck这是怎么回事?