我在一个在T-SQL数据库上运行的系统中遇到了一个相当独特的请求。我有一个表格看起来像这样最基本的形式:
create table Merchants (
ID int not null identity(1,1) primary key,
PartnerID int,
ExternalRef varchar(10),
Name varchar(MAX)
)
ExternalRef
是varchar(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值或任何唯一值,而不占用太多处理?
答案 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)
使用新列添加计算持久列或视图 - 使用ISNUMERIC
和CASE
CAST
确定性函数或使用带有模式绑定的标量函数
alter table Merchants
add ExternRefNbr as (cast(case when isnumeric(ExternalRef) = 1 then ExternalRef end as int)) persisted
在新列上创建索引