2013-12-17 68 views
1

我在数据库中创建了一个DEFAULT约束,我想在几个表中共享这个约束,并且我想编写一个用于添加字段的唯一alter table语句该表如下:T-SQL添加绑定到现有默认约束的列

ALTER TABLE MyTable ADD MyField NOT NULL DEFAULT(DF_EXISTING_DEFAULT) 

以下错误ocurrs:

Msg 128, Level 15, State 1, Line 1 
The name "DF_EXISTING_DEFAULT" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted. 

注意,默认值是DF_EXISTING_DEFAULT已经定义,我不想再写一遍。我该怎么做?任何理由我不应该这样做?这是一个t-sql限制吗?

回答

4

你实际上可以做到这一点,但这样做的机制已被弃用,所以不应该使用。

您可以CREATE DEFAULT对象,然后使用sp_bindefault

没有不被弃用的替换。如果默认的逻辑很复杂,你可以把它放在一个标量UDF中,以避免重复你自己。

+0

嗯,默认并不复杂(例如DEFAULT('简单文本'),但它可以在将来改变。在这种情况下,UDF是避免“代码重复”的唯一方法吗?这个时候是保留一个* single *默认值,并避免那些sql自动约束命名。 – natenho

+0

@natenho - 是的。默认*约束*不能在列之间共享,并且在SQL Server中没有用户定义的全局变量,所以避免在约束定义中重复“简单的文本”这是唯一的方法,你也可以将它存储在一个表中,但这也需要一个UDF来访问,存储在表中的优点可能更容易维护(改变UDF定义将需要删除引用它的所有默认值),但在UDF中硬编码将更有效,而约束定义本身更加如此。 lity。 –

+0

关于“不能共享”......当你在多个表/列中使用'sp_binddefault'作为同一个DF时,你不是在共享约束吗?至少我看不到新的约束条件。 – natenho