先从 sysobject 中或 syscolumn 表中得到所有varchar列名。然后贴入EXCEL,在EXCEL中利用公式生成 alter table xxx alter column xxx var
这个需要用动态SQL,这些表名有规律吗,长度怎么设置?
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)
错了。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
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#就还可以谢谢
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改一下系统表把结果复制到查询分析器里执行即可
语句上面的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 失败。
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) 试试,没有测试的
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)可能长度不够
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)
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
where a.id=b.object_id and a.xtype=167 order by b.name
-------------
我不是很能理解楼上的!!
根据楼上的,我写了上面的方法 现在已经能取到他的列表了,那现在怎么写循环
谢谢
我不会SQL,如果写c#就还可以谢谢
对象'DF_IPC_ShipmentWeight_Name' 依赖于 列'Name'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Name 失败。
---------------------------------
出错这个错误,应该是有约束的问题
from syscolumns a,sysobjects b
where a.id=b.id and a.xtype=167 and b.xtype = 'U'order by b.name我写的是2000下的,你如果2005改一下系统表把结果复制到查询分析器里执行即可
但是执行的时候因为我的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 失败。
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)
试试,没有测试的
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)可能长度不够
是因为防止有些字段是varchar(8000),这里只能转换成nvarchar(4000),不能用nvarchar(8000)