重用CHECK CONSTRAINTS

时间:2010-08-31 09:58:06

标签: sql-server constraints rules

在SQL Server中假设有一个列需要具有相同的数据类型,是否可以在表(或数据库级别)定义检查约束并在定义时将其应用于列?

正如这个(人为的)例子:

ALTER TABLE dbo.tblAuditTrail
ADD CONSTRAINT CK_DecimalNumber
CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$')
GO

现在如何将它与在表级创建它的一个或多个列相关联,或者是使用RULE的答案。

CREATE RULE RU_Decimal
AS
@value LIKE '^\-?\d+\.\d+$'
GO

我知道这个例子是人为的,人们会使用十进制值作为十进制值,但假设由于设计选择不当,这是一个nchar列,你想对它强制执行一些约束。

2 个答案:

答案 0 :(得分:2)

尽管规则确实符合您的要求,但现在不推荐使用它们,而是支持普通的旧检查约束。如果您认为可能需要将数据库移动到SQL Server的未来版本,那么使用规则不是一个好主意。请参阅MSDN文档顶部的“重要”消息:http://msdn.microsoft.com/en-us/library/ms188064.aspx

您可以通过使用用户定义的函数来获得一些重用,并在所有检查约束中调用它,但您仍需要在适用的所有列上显式定义检查约束。

CREATE FUNCTION IsDecimal(@input varchar(max))
RETURNS bit
AS 
BEGIN
    IF @value LIKE '^\-?\d+\.\d+$'
        RETURN 1
    ELSE
        RETURN 0
END
GO 

ALTER TABLE dbo.tblAuditTrail     
    ADD CONSTRAINT CK_DecimalNumber     
    CHECK (dbo.IsDecimal(DecimalColumn) = 1)     
GO

答案 1 :(得分:1)

您的约束是类型约束。

使用SQL,您可以通过用户定义的类型来处理这种情况,其中通过声明多个列属于此类来实现“重用”,

或者您必须将类型约束重复为每个列的CHECK约束。