用户定义的带有检查约束的表类型

时间:2018-11-16 01:17:34

标签: sql-server tsql sql-server-2017

我想创建一个表类型以便在存储过程中使用,但是我想确保传递到表中的参数之一是两个值之一。

如果我正确地解释了文档,则唯一可用的列约束是主键,但是如果我写错了,请更正我。

这是我尝试过的:

create type dealerDisable as table
(id int not null,
dealerNo varchar(10) not null,
dealerName varchar(50),
disabling varchar(5),
constraint ratesOrAll 
check (disabling in ('Rates','All')),
dateAdded date)

这是我得到的错误,它并不能说明所有问题: enter image description here

2 个答案:

答案 0 :(得分:3)

syntax for creating table types的限制更为严格-它不支持命名约束,并且与CREATE TABLE相比还存在一些其他差异。

CREATE TYPE dbo.dealerDisable AS TABLE -- ALWAYS use schema!
(
  id int not null,
  dealerNo varchar(10) not null,
  dealerName varchar(50),
  disabling varchar(5) check (disabling in ('Rates','All')),
  dateAdded date
);

尝试插入值时,可以看到系统必须为表的每个实例创建唯一的约束名称:

DECLARE @d dbo.dealerDisable2;
INSERT @d VALUES(1,'blat','foo','None',getdate());

DECLARE @e dbo.dealerDisable2;
INSERT @e VALUES(1,'blat','foo','None',getdate());

错误:

  

信息547,级别16,状态0   
INSERT语句与CHECK约束“ CK __ #BCAA5D0E__disab__BD9E8147 ”相冲突。   
...   
  
Msg 547,第16级,状态0   
INSERT语句与CHECK约束“ CK __ #AAF87C65__disab__ABECA09E ”相冲突。   
...

如果考虑其背后的机制,这是有道理的。对于 some 类型的约束,您在数据库中只能有一个具有相同名称的约束。这将产生相同类型的错误,例如:

CREATE TABLE #a(id int, CONSTRAINT PK1 PRIMARY KEY (id));

CREATE TABLE #b(id int, CONSTRAINT PK1 PRIMARY KEY (id));

现在,确实可以拥有任意多个具有相同名称的检查约束,但这可能只是语法的简单简化。

答案 1 :(得分:1)

请参阅Documentation。正确的语法应如下所示。没有CONSTRAINT关键字

create type dealerDisable as table
(
    id int not null,
    dealerNo varchar(10) not null,
    dealerName varchar(50),
    disabling varchar(5),
        check (disabling in ('Rates','All')),
    dateAdded date
)
相关问题