【问题标题】:User defined table type with check constraint具有检查约束的用户定义表类型
【发布时间】:2018-11-16 01:17:34
【问题描述】:

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

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

这是我尝试过的:

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)

这是我得到的错误,这并不是那么有启发性:

【问题讨论】:

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


    【解决方案1】:

    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”冲突。
    ...

    消息 547,级别 16,状态 0
    INSERT 语句与 CHECK 约束“CK__#AAF87C65__disab__ABECA09E”冲突。
    ...

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

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

    现在,虽然您可以拥有任意多个同名的检查约束,但这可能只是对语法的简单简化。

    【讨论】:

    • 可以添加命名检查约束吗?
    • @Muflix The syntax diagram in Books Online 说不。
    【解决方案2】:

    请参考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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多