我有一个包含大量NCHAR(n)
列的数据库。其中一些列是简单属性,但有些也是主键或外键。
有许多表格和列以及大量的测试数据。
将每个NCHAR(n)
列转换为相同长度的NVARCHAR(n)
列,并在执行此操作时修剪其内容的最佳方法是什么?
如果你能想到比更改设计器中的列更好的事情,记住列名并在脚本窗口中修剪它,请将其作为答案发布。
答案 0 :(得分:10)
像这样的东西会做我认为的技巧(除非是主键然后你会得到一个错误 - 我建议你在你的情况下手动执行设计器中的主键因为改变它们你必须放弃约束等等,这有点棘手)...
它获取nchar
的所有列的所有表名,列名和大小,并为每个列执行alter
语句以更改列类型,然后update
修剪数据。
可能有一种更高效的方法可以做到这一点,但是如果你只做一次也许这样就可以了(哦,将databaseName
位更改为数据库的名称)......
use databaseName
declare @tn nvarchar(128)
declare @cn nvarchar(128)
declare @ln int
declare @sql as nvarchar(1000)
declare c cursor for
select table_name,column_name,character_maximum_length
from information_schema.columns
where data_type ='nchar' and
TABLE_NAME not in (select TABLE_NAME from INFORMATION_SCHEMA.VIEWS)
open c
fetch next from c into @tn, @cn, @ln
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table ' + @tn + ' alter column '
+ @cn + ' nvarchar(' + convert(nvarchar(50), @ln) + ')'
exec sp_executesql @sql
set @sql = 'update ' + @tn + ' set ' + @cn + ' = LTRIM(RTRIM(' + @cn + '))'
exec sp_executesql @sql
fetch next from c into @tn, @cn, @ln
end
close c
deallocate c