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

时间:2013-11-22 09:33:11

标签: 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'
    ))
)

2 个答案:

答案 0 :(得分:4)

无法向UDT添加检查约束,我建议您根本不使用UDT。如果你需要change it,悲伤是无止境的。

创建表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)
)

答案 1 :(得分:1)

您可以创建自定义数据类型。然后,使用CREATE RULE语句创建一个规则,在其中指定列可以接受的变量值。并通过SP_BINDRULE(系统过程),指定“创建角色的名称”和“用户类型的名称”(注意:规则不适用于数据库中已经创建的值) `

CREATE TYPE ChekNok 
FROM varchar(5)
GO

CREATE RULE RulNok
AS
@per in ('fd','dff')
GO

EXEC SP_bindrule 'RulNok', 'ChekNok'
`