SQL Server 2012:如何创建带有检查约束的类型?

Ser*_*rge 2 sql-server sql-server-2012

如何创建 varchar(8) 类型的 UDT,哪个值应该通过检查约束?

我需要它,因为该类型 + 约束将在几个表中重复使用,我想避免如下重复。

CREATE TABLE dbo.T1 (
    <some columns>
    , Comparison CHAR(4) NOT NULL
    , CONSTRAINT CHK_tRule_Comparison CHECK (Comparison IN (
        'Eq'
        , 'Diff'
        , 'Lt'
        , 'Lte'
        , 'Gt'
        , 'Gte'
        , 'Bgn'
        , 'BgnR'
        , 'End'
        , 'EndR'
    ))
)

CREATE TABLE dbo.T2 (
    <some columns>
    , Comparison CHAR(4) NOT NULL
    , CONSTRAINT CHK_tRule_Comparison CHECK (Comparison IN (
        'Eq'
        , 'Diff'
        , 'Lt'
        , 'Lte'
        , 'Gt'
        , 'Gte'
        , 'Bgn'
        , 'BgnR'
        , 'End'
        , 'EndR'
    ))
)


CREATE TABLE dbo.T3 (
    <some columns>
    , Comparison CHAR(4) NOT NULL
    , CONSTRAINT CHK_tRule_Comparison CHECK (Comparison IN (
        'Eq'
        , 'Diff'
        , 'Lt'
        , 'Lte'
        , 'Gt'
        , 'Gte'
        , 'Bgn'
        , 'BgnR'
        , 'End'
        , 'EndR'
    ))
)
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 5

不可能向 UDT 添加检查约束,我根本不建议您使用 UDT。如果您需要改变它,悲伤是无止境的。

创建一个表RuleComparison并在Comparison列上添加外键约束。

create table RuleComparison
(
  Value char(4) primary key
)

insert into RuleComparison
values ('Eq'),
       ('Diff'),
       ('Lt'),
       ('Lte'),
       ('Gt'),
       ('Gte'),
       ('Bgn'),
       ('BgnR'),
       ('End'),
       ('EndR')

create table T1
(
  ID int identity primary key,
  Comparison char(4) references RuleComparison(Value)
)
Run Code Online (Sandbox Code Playgroud)

  • +1 关于该主题的好文章 [T-SQL UDT。(嗯!)它们有什么用?](http://blogs.msdn.com/b/bartd/archive/2010/08/25/t-sql-udts-what-are-they-good-for. aspx)(不多) (2认同)