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

3
我希望创建一个表类型,用于存储过程中的使用,但我想确保传递到表中的参数是两个值中的一个。
如果我正确理解文档,唯一可用的列约束是主键,如果我理解有误,请纠正我。
这是我尝试过的:
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)

这是我收到的错误信息,它并没有提供太多信息: 图片描述
2个回答

8

创建表类型的语法比较严格,不支持命名约束,并且与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());

错误:

Msg 547,级别16,状态0
插入语句与检查约束“CK__#BCAA5D0E__disab__BD9E8147”冲突。
...

Msg 547,级别16,状态0
插入语句与检查约束“CK__#AAF87C65__disab__ABECA09E”冲突。
...

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

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

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

现在,虽然你可以有多个具有相同名称的检查约束,但这只是语法的一种简单化表述。

1
可以添加命名的检查约束吗? - Muflix
2
@Muflix 在在线书籍中的语法图表中指出不可以。 - Aaron Bertrand

1
请参考文档。正确的语法应该如下所示。不需要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
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接