修改用户定义的数据类型
2005-06-01 20:30
555 查看
--SQLSERVER的自定义类型比较好用吧,但是,一旦引用该数据类型后,想修改数据类型,就是一大头疼的事了,本存储过程就是专门对付它的。
--sp_rebuildallview 见本BLOG中的其它页面
create procedure sp_rechangfieldtype(@typename varchar(50), @newtype varchar(50))
as
begin
declare @typeid int
declare @tablename varchar(50)
declare @column varchar(50)
declare @sqlstr varchar(200)
declare @defaultid int
select @typeid = xusertype
from systypes
where name = @typename and xusertype > 256
AND (is_member('db_owner') = 1 OR is_member('db_ddladmin') = 1 OR is_member(user_name(uid))=1)
declare mycursor cursor for
select o.name, c.name, c.cdefault
from syscolumns c, systypes t, sysusers u, sysobjects o
where c.xusertype = @typeid
and t.xusertype = @typeid
and o.uid = u.uid
and c.id = o.id
and o.type = 'u'
open mycursor
fetch next from mycursor into @tablename, @column, @defaultid
while @@fetch_status = 0
begin
if @defaultid <> 0
begin
set @sqlstr = 'alter table ' + @tablename + ' drop ' + object_name(@defaultid)
exec(@sqlstr)
set @sqlstr = 'alter table ' + @tablename + ' alter column ' + @column + ' ' + @newtype
exec(@sqlstr)
-- set @sqlstr = 'alter table ' + @tablename + ' add contraint ' + @tablename + 'df'+@column + ' default 0'
end
else
begin
set @sqlstr = 'alter table ' + @tablename + ' alter column ' + @column + ' ' + @newtype
print @sqlstr
exec(@sqlstr)
end
--if @@error <> 0
-- continue
fetch next from mycursor into @tablename, @column, @defaultid
end
--如果没有约束,则可以直接删除。如果有约束。先处理约束。
close mycursor
deallocate mycursor
end
GO
create procedure SP_CHANGEFIELD(@OLDTYPENAME VARCHAR(50), @NEWDTYPE VARCHAR(50))
as
begin
exec('sp_addtype U_LOCALTYPE, ''' + @newdtype + '''')
exec SP_rechangfieldtype @OLDTYPENAME, 'U_LOCALTYPE'
EXEC sp_rebuildallview
EXEC('sp_droptype ' + @OLDTYPENAME)
EXEC('sp_addtype ' + @OLDTYPENAME + ', ''' + @newdtype + '''')
exec SP_rechangfieldtype 'U_LOCALTYPE', @OLDTYPENAME
EXEC sp_rebuildallview
EXEC sp_droptype 'U_LOCALTYPE'
end
GO
--以下是示例。将U_HELLO的长度改为 30
SP_ADDTYPE U_HELLO, 'VARCHAR(10)'
GO
CREATE TABLE TESTTYPE(NAME U_HELLO)
GO
SP_CHANGEFIELD 'U_HELLO', 'VARCHAR(30)'
--sp_rebuildallview 见本BLOG中的其它页面
create procedure sp_rechangfieldtype(@typename varchar(50), @newtype varchar(50))
as
begin
declare @typeid int
declare @tablename varchar(50)
declare @column varchar(50)
declare @sqlstr varchar(200)
declare @defaultid int
select @typeid = xusertype
from systypes
where name = @typename and xusertype > 256
AND (is_member('db_owner') = 1 OR is_member('db_ddladmin') = 1 OR is_member(user_name(uid))=1)
declare mycursor cursor for
select o.name, c.name, c.cdefault
from syscolumns c, systypes t, sysusers u, sysobjects o
where c.xusertype = @typeid
and t.xusertype = @typeid
and o.uid = u.uid
and c.id = o.id
and o.type = 'u'
open mycursor
fetch next from mycursor into @tablename, @column, @defaultid
while @@fetch_status = 0
begin
if @defaultid <> 0
begin
set @sqlstr = 'alter table ' + @tablename + ' drop ' + object_name(@defaultid)
exec(@sqlstr)
set @sqlstr = 'alter table ' + @tablename + ' alter column ' + @column + ' ' + @newtype
exec(@sqlstr)
-- set @sqlstr = 'alter table ' + @tablename + ' add contraint ' + @tablename + 'df'+@column + ' default 0'
end
else
begin
set @sqlstr = 'alter table ' + @tablename + ' alter column ' + @column + ' ' + @newtype
print @sqlstr
exec(@sqlstr)
end
--if @@error <> 0
-- continue
fetch next from mycursor into @tablename, @column, @defaultid
end
--如果没有约束,则可以直接删除。如果有约束。先处理约束。
close mycursor
deallocate mycursor
end
GO
create procedure SP_CHANGEFIELD(@OLDTYPENAME VARCHAR(50), @NEWDTYPE VARCHAR(50))
as
begin
exec('sp_addtype U_LOCALTYPE, ''' + @newdtype + '''')
exec SP_rechangfieldtype @OLDTYPENAME, 'U_LOCALTYPE'
EXEC sp_rebuildallview
EXEC('sp_droptype ' + @OLDTYPENAME)
EXEC('sp_addtype ' + @OLDTYPENAME + ', ''' + @newdtype + '''')
exec SP_rechangfieldtype 'U_LOCALTYPE', @OLDTYPENAME
EXEC sp_rebuildallview
EXEC sp_droptype 'U_LOCALTYPE'
end
GO
--以下是示例。将U_HELLO的长度改为 30
SP_ADDTYPE U_HELLO, 'VARCHAR(10)'
GO
CREATE TABLE TESTTYPE(NAME U_HELLO)
GO
SP_CHANGEFIELD 'U_HELLO', 'VARCHAR(30)'
相关文章推荐
- 修改已经被表引用的用户定义数据类型示例.sql
- 修改用户定义的数据类型
- 修改用户定义数据类型对已经编译的存储过程的影响的示例.sql
- 修改用户定义的数据类型
- C#高级编程四十一天----用户定义的数据类型转换
- c#之用户定义的数据类型转换
- SQL 用户定义表类型,在存储过程里使用数据类型作参数
- 创建与删除用户定义数据类型示例.sql
- c#之用户定义的数据类型转换介绍
- 第七章、更高级的索引结构(XML索引、用户定义数据类型、层次数据、空间数据、文件流、表压缩)
- sp_rename 更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。
- c#之用户定义的数据类型转换
- 创建用户定义的数据类型
- 第一部分 数据内存存储、常预定义值类型、用户自定义值类型、预定义引用类型
- SQL 用户定义表类型,在存储过程里使用数据类型作參数
- 如何把"用户定义的数据类型"的ower改为dbo
- SQL SERVER 使用存储过程创建、删除用户定义数据类型
- C#高级编程四十一天----用户定义的数据类型转换
- 为用户定义的数据类型绑定默认值示例.sql
- 创建用户定义的数据类型