日期:2014-05-18  浏览次数:20784 次

如何一次性修改字段类型
我的系统设计时没考虑繁体中文,文本字段都用了varchar(n)、text,最近移植到繁体下,需要变更为
nvarchar(n)、ntext,由于很多表很多字段,一个个改太麻烦了,有没有通过语句一次性改的?
另外有些字段用char(n),也想一起变更为nvarchar(n)

------解决方案--------------------
SQL code
alter table tablename alter column columnname nvarchar(n)

------解决方案--------------------
建议你修改之前先备份。
------解决方案--------------------
SQL code

--一次性修改
declare @sql nvarchar(4000)
set @sql=''
select @sql=@sql+'alter table 表名 alter column '+name+' nvarchar(255)
'
from syscolumns where id=OBJECT_ID(N'表名')

exec (@sql)

------解决方案--------------------
~~错了
------解决方案--------------------
参考3楼可以实现
------解决方案--------------------
在三楼的基础上 加个判断就可以了
------解决方案--------------------
syscolumns 表中
where xtype=35 的 你就把属性改成 ntext
where xtype=167 的 你就把属性改成 nvarchar
where xtype=175 的 你就把属性改成 nchar
------解决方案--------------------
SQL code


--修改过之后  join XTYPE  

declare @sql nvarchar(4000)
set @sql=''
select @sql=@sql+'alter table 表名 alter column '+a.name+''''+b.name+''' ('+convert(nvarchar,a.length)+')
'
from syscolumns a join systypes b on a.xtype=b.xtype 
 where a.id=OBJECT_ID(N'表名') 

select @sql
exec (@sql)

------解决方案--------------------
探讨
另外,数据库下有几十个表,怎么遍历一下?

------解决方案--------------------
探讨

引用:
另外,数据库下有几十个表,怎么遍历一下?

用Cursor,从系统表syscolumns 里遍历。

------解决方案--------------------
探讨
另外,数据库下有几十个表,怎么遍历一下?

------解决方案--------------------
SQL code


--我自己没有测试过,不敢测试,反正逻辑就是这样的,直接写WHILE语句循环

 select name,p_id= identity(int,1,1)  into #3 from sys.tables
 
 select * from #3
 
 declare @p_id int,@LEN_ID int
 SET @LEN_ID=(SELECT COUNT(*) FROM #3)
 SET @p_id=1
 SELECT @LEN_ID,@p_id
 while (@p_id<=@LEN_ID)
 BEGIN
    declare @sql nvarchar(4000)
    declare @table varchar(200)
    set @table=(select name from #3 where p_id=@p_id)
    set @sql=''
    select @sql=@sql+'alter table '+@table+' alter column '+a.name+''+b.name+' ('+convert(nvarchar,a.length)+')
    '
    from syscolumns a join systypes b on a.xtype=b.xtype 
     where a.id=OBJECT_ID(@table)

    exec (@sql)
    set @p_id=@p_id+1
 END

------解决方案--------------------
alter table tablename alter column columnname nvarchar(n)