/*--修改/删除有默认值的字段 示例--*/--测试表
Create Table t1(
ID  int  Default(0),
Name Varchar(16)  Default(16),
Memo Varchar(255) Default('')
)
go--要求,删除name字段,将memo字段改为: Memo Varchar(32) Default(32)--处理方法----a.先删除要处理字段的默认值约束
declare @s varchar(8000)
set @s=''
select @s=@s+'
alter table ['+b.name+'] drop constraint ['+d.name+']'
from syscolumns a
join sysobjects b on a.id=b.id
join syscomments c on a.cdefault=c.id
join sysobjects d on c.id=d.id
where b.name='t1' 
and (a.name='name' or a.name='memo')
exec(@s)----b.再删除字段 name
alter table t1 drop column [name]----c.修改字段 memo
alter table t1 alter column [memo] varchar(32)----d.为字段 memo 添加默认值约束
set @s='alter table t1 add constraint
[df__t1__memo__'+cast(newid() as varchar(36))
+'] default (32) for memo'
exec(@s)
go--插入数据测试
insert t1 values(default,default)
select * from t1
go--删除测试
drop table t1/*--测试结果
ID          Memo                             
----------- -------------------------------- 
0           32(所影响的行数为 1 行)
--*/

解决方案 »

  1.   

    sp_bindefault
    将默认值绑定到列或用户定义的数据类型。语法
    sp_bindefault [ @defname = ] 'default' ,
        [ @objname = ] 'object_name'
        [ , [ @futureonly = ] 'futureonly_flag' ] 参数
    [@defname =] 'default'由 CREATE DEFAULT 语句创建的默认名称。default 的数据类型为 nvarchar(776),无默认值。[@objname =] 'object_name'要绑定默认值的表和列名称或用户定义的数据类型。object_name 的数据类型为 nvarchar(517),无默认值。如果 object_name 没有采取 table.column 格式,则认为它属于用户定义数据类型。默认情况下,用户定义数据类型的现有列继承 default,除非默认值直接绑定到列中。默认值无法绑定到 timestamp 数据类型的列、带 IDENTITY 属性的列或者已经有 DEFAULT 约束的列。说明  object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息,请参见分隔标识符。 
    [@futureonly =] 'futureonly_flag'仅在将默认值绑定到用户定义的数据类型时才使用。futureonly_flag 的数据类型为 varchar(15),默认值为 NULL。将此参数设置为 futureonly 时,它会防止现有的属于此数据类型的列继承新的默认值。当将默认值绑定到列时不会使用此参数。如果 futureonly_flag 为 NULL,那么新默认值将绑定到用户定义数据类型的任一列,条件是此数据类型当前无默认值或者使用用户定义数据类型的现有默认值。返回代码值
    0(成功)或 1(失败)注释
    可以使用 sp_bindefault 在不取消绑定现有默认值的情况下,将新默认值绑定到列(尽管最好使用 DEFAULT 约束)或者绑定到用户定义的数据类型。原有默认值将被替代。不能将默认值绑定到 Microsoft® SQL Server™ 数据类型。如果默认值和要绑定的列不兼容,那么在试图插入默认值时(不是在绑定时),SQL Server 将返回错误信息。除非直接绑定了默认值或者将 futureonly_flag 指定为 futureonly,否则用户定义数据类型的现有列将继承新默认值。用户定义数据类型的新列始终继承默认值。将默认值绑定到列时,相关信息将添加到 syscolumns 表中。将默认值绑定到用户定义的数据类型时,相关信息将添加到 systypes 表中。权限
    只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色成员及表所有者才能执行 sp_bindefault。示例
    A. 将默认值绑定到列
    假定已经用 CREATE DEFAULT 语句在当前数据库中定义了名为 today 的默认值,此示例将默认值绑定到 employees 表的 hire date 列。当将行添加到 employees 表而且没有提供 hire date 列的数据时,列取得默认值 today 的值。USE master
    EXEC sp_bindefault 'today', 'employees.[hire date]'B. 将默认值绑定到用户定义的数据类型
    假定存在命名为 def_ssn 的默认值和命名为 ssn 的用户定义数据类型,此示例将默认值 def_ssn 绑定到用户定义的数据类型 ssn 中。在创建表时,所有指派了用户定义数据类型 ssn 的列都将继承默认值。类型 ssn 的现有列也继承默认值 def_ssn,除非为 futureonly_flag 值指定了 futureonly,或者在列上直接绑定了默认值。绑定到列的默认值始终优先于绑定到数据类型的默认值。USE master
    EXEC sp_bindefault 'def_ssn', 'ssn'C. 使用 futureonly_flag
    此示例将默认值 def_ssn 绑定到用户定义的数据类型 ssn。因为已指定 futureonly,所以不影响类型 ssn 的现有列。USE master
    EXEC sp_bindefault 'def_ssn', 'ssn', 'futureonly'D. 使用分隔标识符
    此示例显示了在 object_name 中分隔标识符的使用。USE master
    CREATE TABLE [t.1] (c1 int) 
    -- Notice the period as part of the table name.
    EXEC sp_bindefault 'default1', '[t.1].c1' 
    -- The object contains two periods; 
    -- the first is part of the table name, 
    -- and the second distinguishes the table name from the column name.