VARCHAR字段中的下一个最大值或下一个唯一值

时间:2017-04-06 09:48:21

标签: sql sql-server tsql

我在一个在T-SQL数据库上运行的系统中遇到了一个相当独特的请求。我有一个表格看起来像这样最基本的形式:

create table Merchants (
    ID          int not null identity(1,1) primary key,
    PartnerID   int,
    ExternalRef varchar(10),
    Name        varchar(MAX)
)

ExternalRefvarchar(10)字段,其中我们带有由多个外部方之一提供的参考号。因此,它仅在PartnerID值定义的范围内唯一。

我现在遇到的问题是,一个合作伙伴没有能够为我们提供的价值,并希望我们为他们创造价值。这很容易,我可以使用递增的整数值并将它们转换为varchar。因此,在分配新值之前,我可以简单地执行select max(ExternalRef) where PartnerID = @PartnerID,转换为整数,将值加1并将其转换回varchar。事实上,DBMS将隐式地执行所有转换,这样的事情应该可以正常工作:

select @NewRef = max(ExternalRef)+1
from Merchants
where PartnerID = @PartnerID

但我担心的是,如果该合作伙伴的某个值是字母数字值并且select max(ExternalRef)调用返回了该怎么办?上述方法显然会以一种丑陋的方式失败,而且我不知道如何增加"一个字母数字字符串,无论是什么意思。

所以我需要一种方法来提出表中尚不存在的唯一varchar(10)值。我可以生成一个随机值,检查它是否已经在表中并重复,如果它是,但我也不会对这种方法感到生气。如果我可以在where子句中使用某些内容将结果限制为仅数字的值,那么这也会有效,但我无法想到这样做的优雅方法。类似的东西:

select @NewRef = coalesce(max(ExternalRef), 0)+1
from Merchants
where PartnerID = @PartnerID
    and ExternRef is numeric

有人会就如何产生"下一个最大的"字段上的varchar值或任何唯一值,而不占用太多处理?

2 个答案:

答案 0 :(得分:0)

哦,我已经明白了。原来我想象的“数字”条件并非如此遥不可及。从SQL Server 2008开始,有ISNUMERIC函数。因此,要获得varchar字段中下一个最大整数值的varchar表示,这就是我现在正在做的事情:

select @NewRef = coalesce(max(ExternalRef), 0)+1
from Merchants
where PartnerID = @PartnerID
    and ISNUMERIC(ExternRef) = 1

答案 1 :(得分:0)

  1. 使用新列添加计算持久列或视图 - 使用ISNUMERICCASE CAST确定性函数或使用带有模式绑定的标量函数

    alter table Merchants 
    add ExternRefNbr as (cast(case when isnumeric(ExternalRef) = 1 then ExternalRef end as int)) persisted
    
  2. 在新列上创建索引

  3. 使用专栏