如果一个值是另一个值的前缀,则阻止输入该值

Prevent a value from being entered if it's a prefix of another value

如何防止输入的值是同一列中另一个值的前缀?例如,如果 MyTable.NumberPrefix 已经包含 abc,则无法添加 ab

我的第一次尝试(如下)是使用索引视图。但是无法在使用派生 table 的视图上创建唯一索引(而且我不知道如何在没有它的情况下编写视图)。

create view MyTable
with schemabinding
as
select
  left(a.NumberPrefix, b.Length) as CommonPrefix
from 
  dbo.MyTable a
  cross join
  (
    select distinct
      len(NumberPrefix) as Length
    from
      dbo.MyTable
  ) b

create unique clustered index MyIndex on MyTable (CommonPrefix) --ERROR

部分测试数据:

insert MyTable (NumberPrefix) values ('abc')  -- OK
insert MyTable (NumberPrefix) values ('ab')   -- Error
insert MyTable (NumberPrefix) values ('a')    -- Error
insert MyTable (NumberPrefix) values ('abd')  -- OK
insert MyTable (NumberPrefix) values ('abcd') -- Error

check constraintuser defined function一起使用:

create function fnPrefix(@prefix varchar(100))
returns bit
as
begin
    if (select count(*) from MyTable 
        where MyColumn like @prefix + '%' or @prefix like MyColumn + '%') > 1
        return 0

    return 1
end

然后添加约束:

alter table MyTable
add constraint  chkPrefix check(dbo.fnPrefix(MyColumn) = 1)