欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Sql随手笔记 » 正文

热门阅读

在Sql Server中利用sql语句批量添加与删除列的默认值

创建时间:2011年12月16日 15:17  阅读次数:(8514)
分享到:
在Sql Server中,如果使用了自定义函数作为列的默认值,那么这个自定函数就不可以再修改了。这是一件很郁闷的事情,今天自己就遇到这样的情况。要修改一个已经作为列的默认值的函数,提示以下错误:
无法对 '' 执行 ALTER,因为对象 '' 正引用它
很无奈,只有先把所有引用了该函数的默认值全部删除掉,再来修改这个函数了。

利用sql查询了一下引用了该函数作为列的默认值的表,一共有500多个,查询方法可见下面链接:
在Sql Server中利用sql语句查询所有默认值
要手动一个一个的从microsoft sql server management studio中去修改,显示是行不通的方案,琢磨了一下,写出以下sql,用来批量删除所有引用了该函数的默认值。

declare @tablename varchar(50)
declare @default_constraint_name varchar(50)
declare @str_sql varchar(1000)

declare result_cur cursor for 
select a.name,object_name(a.parent_object_id) as tablename
from sys.default_constraints a left join sys.columns b on 
a.parent_object_id=b.object_id and b.column_id=a.parent_column_id 
where a.definition='函数名' and b.name='列名'

open result_cur
fetch next from result_cur into @default_constraint_name,@tablename
while @@fetch_status=0
begin
set @str_sql='alter table '+@tablename+' drop constraint '+@default_constraint_name
exec(@str_sql)

fetch next from result_cur into @default_constraint_name,@tablename
end

在上面示例中使用到了游标,关于游标的使用,可以参考以下链接:
在Sql Server中创建游标示例

删除了所有的默认值,在修改了函数后,我们又需要将默认值添加回来。
添加的sql如下:
declare @tablename varchar(50)
declare @columnname varchar(50)
declare @sql varchar(1000)

declare result_cur cursor local for
select a.name,b.name as columnname
from sys.tables a inner join sys.columns b 
on a.object_id=b.object_id 
where b.name='列名'

open result_cur
fetch next from result_cur into @tablename,@columnname
while @@fetch_status=0
begin
set @sql='alter table '+@tablename+' add constraint DF_'+@tablename+'_'+@columnname+'_Default default(函数名)) for ' +@columnname
exec(@sql)

fetch next from result_cur into @tablename,@columnname
end
close result_cur
deallocate result_cur

上面方法用到了利用sql添加约束,关于该用法,大家可以参考以下链接:
利用Sql语句创建主键,check约束,默认值,外键

本章主要例举了在Sql Server中利用sql语句批量添加与删除列的默认值的两个示例,希望能给大家带来帮助。;
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 37+0=? 的结果(结果是:37)
结  果: