在Sql Server中使用sql语句批量增加与删除列的默许值
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。怎么恢复呢? 一个是把SQL语句写到客户端,可以使用DataSet进行加工; 多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 连做梦都在想页面结构是怎么样的,绝非虚言 你可以简单地认为适合的就是好,不适合就是不好。 需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
页:
[1]