日期:2014-05-18 浏览次数:20626 次
/*====================================================*/
-- Author: 黄光伟
-- Create date: 2010-06-03 21:00:02
-- Description: 批量修改字段长度,考虑待修改字段为主键或者外键或者索引的情况 使用sp_helpindex列出索引信息
-- 版本 MSSQL2000
/*====================================================*/
--参数信息
declare @colname varchar(50)--字段名称
declare @length int --长度
declare @type varchar(20)--类型 --未考虑待完善
declare @addlen int--是否有长度 --未考虑待完善
--赋值
select @colname = 'mat_code',
@length = 50
declare @tablename varchar(50),@sql varchar(8000),@exec varchar(8000)
declare @pkname varchar(100)--主键名
declare @pkfieldname varchar(500) --主键字段名
declare @isnullable char(1) -- 是否为空
declare @foreignkey varchar(100)--外键名
declare @foreignname varchar(500) --外键字段名
declare @displayname varchar(500) --外键对应字段名
declare @displaytable varchar(50) --外键对应表名
declare @display varchar(50) --外键对应字段
declare @isnull char(1) -- 外键对应字段是否为空
--索引临时表
create table #index(
index_name varchar(50),
index_declare varchar(500),
index_keys varchar(300)
)
--start
select t.name,r.isnullable into #temp from sysobjects t,syscolumns r
where t.id = r.id and t.xtype = 'U' and
r.name = @colname --and r.length = 20
declare cursor_temp cursor for
--含该字段的表
select * from #temp
open cursor_temp
fetch cursor_temp into @tablename,@isnullable
while @@fetch_status = 0
begin
begin tran
--初始化
select @pkfieldname = '',@pkname = '',@foreignkey='',@foreignname='',
@displayname = '',@displaytable='',@display= ''
--清空索引临时表
truncate table #index
--插入索引信息
insert into #index
exec sp_helpindex @tablename
--判断主键是否存在该字段
if exists(select 1 from #index where charindex('primary key',index_declare) > 0 and
charindex(','+@colname+',',','+replace(rtrim(ltrim(index_keys)),', ',',')+',') > 0)
begin
select @pkname = index_name,@pkfieldname = index_keys from #index
where charindex('primary key',index_declare) > 0 and
charindex(','+@colname+',',','+replace(rtrim(ltrim(index_keys)),', ',',')+',') > 0
--删除主键
set @sql = 'alter table '+ @tablename + ' drop constraint ' + @pkname
print @sql+char(13)+char(10)+'go'
exec(@sql)
end
--重建主键另一方法
/*
-- 取得主键名
select @pkname = name from sysobjects where xtype = 'PK'
and parent_obj = object_id(@tablename,'U')
--判断主键是否存在该字段
if exists(select 1 from sysindexkeys ,syscolumns,sysindexes
where sysindexkeys.colid = syscolumns.colid and
sysindexkeys.id = syscolumns.id and
sysindexkeys.indid = sysindexes.indid and
sysindexkeys.id = sysindexes.id and
sysindexes.name = @pkname and syscolumns.name = @colname)
begin
-- 主键字段
select @pkfieldname = @pkfieldname+syscolumns.name+',' from sysindexkeys ,syscolumns,sysindexes
where sysindexkeys.colid = syscolumns.colid and
sysindexkeys.id = syscolumns.id and
sysindexkeys.indid = sysindexes.indid and
sysindexkeys.id = sysindexes.id and
sysindexes.name = @pkname
-- 刪除旧主键
set @sql = 'alter table '+ @tablename + ' drop constraint ' + @pkname
print @sql+char(13)+char(10)+'go'
exec(@sql)
end
*/
--判断索引是否存在该字段
if exists(select 1 from #index where charindex('primary key',index_declare) = 0 and
charindex(','+@colname+',',','+replace(rtrim(ltrim(index_keys)),', ',',')+',') > 0)
begin
select @sql = '',@exec = ''
select @sql = @sql + char(13)+char(10)+'drop index dbo.'+@tablename+'.'+index_name+char(13)+char(10)
from #index where charinde