regex 使用^[A-Z]{3}[0-9]{6}$进行检查- SQL Server

xdnvmnnf  于 2022-11-18  发布在  SQL Server
关注(0)|答案(1)|浏览(80)
CREATE TABLE PARTICIPANTE(
    pasaporte NVARCHAR(9) NOT NULL,
    nombre NVARCHAR(50) NOT NULL,
    sexo CHAR(1) NOT NULL,
    fecNac DATE NOT NULL,
    codPais NVARCHAR(3) NOT NULL,
    CONSTRAINT PK_PARTICIPANTE PRIMARY KEY (pasaporte),
    CONSTRAINT FK_PAIS_PARTICIPANTE FOREIGN KEY (codPais) REFERENCES PAIS(codigo),
    CONSTRAINT CHK_PASAPORTE CHECK (pasaporte like '^\[A-Z\]{3}\[0-9\]{6}$')
)

尝试插入数据时,CONSTRAINT CHK_PASAPORTE不起作用。
INSERT语句与CHECK约束“CHK_PASAPORTE”冲突。冲突发生在数据库“OMA”,表“dbo.PARTICIPANTE”,列“pasaport”中。
范例

insert into PARTICIPANTE (pasaporte,nombre,sexo,fecNac,codPais) value ('JPN865653','Noguchi','F','20000104','JPN');

有人能给我解释一下为什么这不起作用,我该如何修复它?

x6492ojm

x6492ojm1#

正如我在评论中提到的,SQL Server没有(内置的)对Regex的支持,它只有 * 基本 * 模式匹配,这在文档中有解释。
幸运的是,您所追求的逻辑似乎相当简单; 3个字母后跟6个数字。这可以通过以下约束条件实现:

ALTER TABLE dbo.PARTICIPANTE ADD CONSTRAINT CHK_PASAPORTE CHECK (pasaporte LIKE '[A-Z][A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9]');

请注意,如果您要求该值仅包含大写值,则需要将该值COLLATE为区分大小写得排序规则 * 并 * 先按大写字母排序,然后按小写字母排序,最后按字母顺序排序(二进制排序规则就是这样一种排序规则).

相关问题