我想创建一个表类型以便在存储过程中使用,但是我想确保传递到表中的参数之一是两个值之一。
如果我正确地解释了文档,则唯一可用的列约束是主键,但是如果我写错了,请更正我。
这是我尝试过的:
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)
答案 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
)