马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
BlackHole黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继在SqlServer中,假如利用了自界说函数作为列的默许值,那末这个自定函数就不成以再修正了。这是一件很忧郁的事变,明天本人就碰到如许的情形。要修正一个已作为列的默许值的函数,提醒以下毛病:
没法对实行ALTER,由于工具正援用它
很无法,只要先把一切援用了该函数的默许值全体删撤除,再来修正这个函数了。
使用sql查询了一下援用了该函数作为列的默许值的表,一共有500多个,查询办法可见上面链接:
在SqlServer中使用sql语句查询一切默许值
要手动一个一个的从microsoftsqlservermanagementstudio中往修正,显现是行欠亨的计划,揣摩了一下,写出以下sql,用来批量删除一切援用了该函数的默许值。
declare@tablenamevarchar(50)
declare@default_constraint_namevarchar(50)
declare@str_sqlvarchar(1000)
declareresult_curcursorfor
selecta.name,object_name(a.parent_object_id)astablename
fromsys.default_constraintsaleftjoinsys.columnsbon
a.parent_object_id=b.object_idandb.column_id=a.parent_column_id
wherea.definition=函数名andb.name=列名
openresult_cur
fetchnextfromresult_curinto@default_constraint_name,@tablename
while@@fetch_status=0
begin
set@str_sql=altertable+@tablename+dropconstraint+@default_constraint_name
exec(@str_sql)
fetchnextfromresult_curinto@default_constraint_name,@tablename
end
在下面示例中利用到了游标,关于游标的利用,能够参考以下链接:
在SqlServer中创立游标示例
删除一切的默许值,在修正了函数后,我们又必要将默许值增加返来。
增加的sql以下:
declare@tablenamevarchar(50)
declare@columnnamevarchar(50)
declare@sqlvarchar(1000)
declareresult_curcursorlocalfor
selecta.name,b.nameascolumnname
fromsys.tablesainnerjoinsys.columnsb
ona.object_id=b.object_id
whereb.name=列名
openresult_cur
fetchnextfromresult_curinto@tablename,@columnname
while@@fetch_status=0
begin
set@sql=altertable+@tablename+addconstraintDF_+@tablename+_+@columnname+_Defaultdefault(函数名))for+@columnname
exec(@sql)
fetchnextfromresult_curinto@tablename,@columnname
end
closeresult_cur
deallocateresult_cur
下面办法用到了使用sql增加束缚,关于该用法,人人能够参考以下链接:
使用Sql语句创立主键,check束缚,默许值,外键
本章次要例举了在SqlServer中使用sql语句批量增加与删除列的默许值的两个示例,但愿能给人人带来匡助。但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢? |