在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语句批量添加与删除列的默认值的两个示例,希望能给大家带来帮助。;