在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列,你想对它强制执行一些约束。
答案 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约束。