您的位置:首页 > 数据库

SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int

2012-11-24 18:52 495 查看
--SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int

--关键说明:

--1、从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段

--2、更新字段类型前如果该字段有默认值索引则应先删除掉对应的索引

--3、数据表字段数据类型为tinyint在CodeSmith中读出来的是DbType.Byte类型,需要修正

declare @TableName nvarchar(250)

--声明读取数据库所有数据表名称游标mycursor1

declare mycursor1 cursor for select name from dbo.SysObjects WHERE OBJECTPROPERTY(ID, 'IsUserTable') = 1

--打开游标

open mycursor1

--从游标里取出数据赋值到我们刚才声明的数据表名变量中

fetch next from mycursor1 into @TableName

--如果游标执行成功

while (@@fetch_status=0)

begin

--定义游标中要修正的字段名变量

Declare @ColumnName nvarchar(255)

Declare @ColumnID int

--通过游标读取指定数据表的所有类型为tinyint的字段

--声明游标mycursor2

declare mycursor2 cursor for select name,colid from syscolumns Where ID=OBJECT_ID(@TableName) and xtype='48' order by colid

--打开游标

open mycursor2

--从游标里取出数据赋值到我们刚才声明的字段名变量中

fetch next from mycursor2 into @ColumnName,@ColumnID

--如果游标执行成功

while (@@fetch_status=0)

begin

--1、如果当前字段存在默认值索引则应先删除

IF EXISTS (select * from sys.default_constraints where parent_object_id=OBJECT_ID(@TableName) and
parent_column_id=@ColumnID)

BEGIN

Declare @ConstraintName nvarchar(255)

select @ConstraintName=name from sys.default_constraints where parent_object_id=OBJECT_ID(@TableName) and
parent_column_id=@ColumnID

exec ('ALTER TABLE ['+@TableName+'] DROP CONSTRAINT ['+@ConstraintName+']')

END

--2、更新当前字段[tinyint]类型为[int]类型

exec ('ALTER TABLE ['+@TableName+'] ALTER COLUMN ['+@ColumnName+'] int')

--用游标去取下一条记录

fetch next from mycursor2 into @ColumnName,@ColumnID

end

--关闭游标

close mycursor2

--撤销游标

deallocate mycursor2

--用游标去取下一条记录

fetch next from mycursor1 into @TableName

end

--关闭游标

close mycursor1

--撤销游标

deallocate mycursor1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐