如何在Sql中创建用户定义的Type

时间:2018-02-23 10:19:03

标签: sql-server integrity

我不知道如何使用可选约束创建域名? 我试过了

CREATE DOMAIN idx INT CHECK (VALUE > 100 AND VALUE < 999);

但面对下面的错误 未知对象类型&#39; DOMAIN&#39;用于CREATE,DROP或ALTER语句。

2 个答案:

答案 0 :(得分:2)

CREATE TYPE myType AS TABLE
(
   idx INT,
   CHECK (idx > 100 AND idx < 999)
)

或者您也可以创建规则并将它们绑定到您的类型。

CREATE TYPE [dbo].[myType] 
FROM [INT] NOT NULL
GO

CREATE RULE multiplyByTen
AS @myType % 10 = 0
AND @myType > 100
AND @myType < 999

然后Bind Rule

EXEC sp_bindrule 'multiplyByTen', 'myType'

答案 1 :(得分:1)

您可能需要查看this

它解释了如何在sql-server中创建类型。有3种类型。您尝试创建的那个不允许添加CHECK CONSTRAINT。您需要改为使用rules

在您的情况下,您应该使用下一个查询:

--First we create the rule.
CREATE RULE range_rule  
AS   
    @range >= 100 AND @range < 999; 
GO

--Then we create the user-defined data type
CREATE TYPE int_and_range FROM INT;

--Then we bind the rule to the data type.
EXEC sys.sp_bindrule @rulename=N'[dbo].[range_rule]', @objname=N'[dbo].[int_and_range]'

完成此操作后,我们可以进行此类测试:

CREATE TABLE test_table (
    custom_data_type_column int_and_range
)

--Try to insert a value against our rule
INSERT INTO dbo.test_table
        ( custom_data_type_column )
VALUES  ( 10  
          )

--RESULT:
--A column insert or update conflicts with a rule imposed by a previous CREATE RULE statement. The statement was terminated. 
--The conflict occurred in database 'db', table 'dbo.test_table', column 'custom_data_type_column'.  
--The statement has been terminated.

--Inserting a valid data:  
INSERT INTO dbo.test_table
        ( custom_data_type_column )
VALUES  ( 100 )

--RESULT:
--(1 row(s) affected)

--Select
Select * FROM test_table

--RESULT:

custom_data_type_column
-----------------------
100

(1 row(s) affected)

请注意,CREATE RULE页面说:

  

此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。我们建议您使用检查约束。通过使用CREATE TABLE或ALTER TABLE的CHECK关键字创建检查约束。有关更多信息,请参阅唯一约束和检查约束。