在 SQL Server 中,默认值定义为与表中特定列关联的约束。所有约束都有一个名称;这很重要,因为一旦创建了约束,如果你想修改它,你必须用这个名字来引用它。 (我会关注这个问题,看看我是不是错了。)
基于此示例表:
CREATE TABLE MyTable
(
MyTableId int not null
,SomeData varchar(50) not null default 'Foo'
,MoreData datetime not null default CURRENT_TIMESTAMP
)
第 1 步:确定列上是否存在约束。有几种方法可以做到这一点,都涉及系统视图和/或元数据功能。这是一个快速的,可以将“MyTable”和“SomeData”设置为参数:
SELECT name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')
试一试,您会发现生成的名称本质上是随机的废话。要确定列上是否存在默认值,您可以这样做:
IF exists (select name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
PRINT 'Default found'
ELSE
PRINT 'NoDefault'
要删除您不知道名称的现有默认值,您必须构建动态 SQL。 (引用文章中的代码是错误的,显然从未测试过。)@Călin 的做法与我的做法略有不同,但想法是一样的:
DECLARE @Command nvarchar(max)
SELECT @Command = 'ALTER TABLE MyTable drop constraint ' + name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')
IF @Command is not null
EXECUTE sp_executeSQL @Command
(带有错误检查,正在检查的表和列的参数等等。)
最后,您可以通过在创建约束时命名默认值来避免大部分情况,如下所示:
CREATE TABLE MyTable
(
MyTableId int not null
,SomeData varchar(50) not null
constraint DF_MyTable__SomeData default 'Foo'
,MoreData datetime not null
constraint DF_MyTable__MoreData default CURRENT_TIMESTAMP
)
或者像这样:
IF not exists (select name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
ALTER TABLE MyTable
add constraint DF_MyTable__SomeData
default 'Foo' for SomeData