3

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

就像在这个(人为的)示例中一样:

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

现在如何将它与在表级别创建它的一个或多个列相关联,或者使用 RULE viz 来解决这个问题。

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

我知道该示例是人为设计的,人们会使用十进制列作为十进制值,但由于设计选择不佳,假设这是一个 nchar 列,并且您想对其施加一些约束。

4

2 回答 2

3

尽管规则确实满足您的要求,但它们现在已被弃用,取而代之的是普通的旧检查约束。如果您认为数据库可能需要迁移到 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
于 2010-08-31T10:02:02.887 回答
1

您的约束是类型约束。

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

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

于 2010-08-31T10:03:49.603 回答