因为我本来的数据库的字符类型都是用varchar
但是放在一台国外的服务器的时候中文全都变成???
了解了后知道将varchar改为nvarchar就可以了但我数据库有100+个表,手动太慢了
求SQL语句,谢谢

解决方案 »

  1.   

    先从 sysobject 中或 syscolumn 表中得到所有varchar列名。然后贴入EXCEL,在EXCEL中利用公式生成 alter table xxx alter column xxx var
      

  2.   

    这个需要用动态SQL,这些表名有规律吗,长度怎么设置?
      

  3.   

    use DB_NAME declare @sql varchar(max)
    select 'alter table '+b.name+' alter column '+a.name+'  nvarchar('+cast(a.length as varchar(10))+')' 
    from syscolumns a,sys.tables b 
    where a.id=b.object_id and a.xtype=167
    exec(@sql)
      

  4.   

    错了。while 1=1
    begin
    declare @sql varchar(max)
    SELECT TOP (1) @sql='alter table '+b.name+' alter column '+a.name+' nvarchar('+cast(a.length as varchar(10))+')' 
    from syscolumns a,sys.tables b 
    where a.id=b.object_id and a.xtype=167IF @@ROWCOUNT<>0
    exec(@sql)
     else
    break
    end

      

  5.   

    select b.name as 表名, a.name as 字段名, a.length as 长度  from syscolumns a,sys.tables b 
    where a.id=b.object_id and a.xtype=167 order by b.name
    -------------
    我不是很能理解楼上的!!
    根据楼上的,我写了上面的方法 现在已经能取到他的列表了,那现在怎么写循环
    谢谢
    我不会SQL,如果写c#就还可以谢谢
      

  6.   

    消息 5074,级别 16,状态 1,第 1 行
    对象'DF_IPC_ShipmentWeight_Name' 依赖于 列'Name'。
    消息 4922,级别 16,状态 9,第 1 行
    由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Name 失败。
    ---------------------------------
    出错这个错误,应该是有约束的问题
      

  7.   

    select 'alter table '+b.name+' alter column '+a.name +' varchar(' +ltrim(a.length)+')'
    from syscolumns a,sysobjects b 
    where a.id=b.id and a.xtype=167 and b.xtype = 'U'order by b.name我写的是2000下的,你如果2005改一下系统表把结果复制到查询分析器里执行即可
      

  8.   

    语句上面的ldslove的我看了是可以的,
    但是执行的时候因为我的varchar设置了默认值
    所以报alter table [IPC_ShipmentWeight] alter column [Name] nvarchar(50)

    消息 5074,级别 16,状态 1,第 1 行
    对象'DF_IPC_ShipmentWeight_Name' 依赖于 列'Name'。
    消息 4922,级别 16,状态 9,第 1 行
    由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Name 失败。
      

  9.   

    declare @sql varchar(max)
    set @sql=''
    select @sql=@sql+ 'alter table ['+a.name+'] alter column ['+b.name+'] Nvarchar('+ltrim(b.length/2)+');' 
    from sys.objects a,sys.columns b,sys.types c
    where a.id=b.id and b.xtype=c.xtype
    and a.xtype='u' and c.name='varchar'--print @sqlexec(@sql)
    试试,没有测试的
      

  10.   

    declare @sql varchar(max)
    set @sql=''
    select @sql=@sql+ 'alter table ['+a.name+'] alter column ['+b.name+'] Nvarchar('+ltrim(b.length/2)+');' 
    from sysobjects a,syscolumns b,systypes c
    where a.id=b.id and b.xtype=c.xtype
    and a.xtype='u' and c.name='varchar'--print @sqlexec(@sql)
    不知道05是不是也用sysobjects ,syscolumns ,systypes ,sql2000用varchar(8000)可能长度不够
      

  11.   

    只所以用b.length/2 
    是因为防止有些字段是varchar(8000),这里只能转换成nvarchar(4000),不能用nvarchar(8000)