将所有NCHAR列转换为数据库或表中的NVARCHAR列

xsl*_*xsl 4 sql-server type-conversion

我有一个包含很多NCHAR(n)列的数据库.其中一些列是简单属性,但有些也是主键或外键.

有许多表和列以及大量的测试数据.

将每NCHAR(n)列转换NVARCHAR(n)为相同长度的列并修剪其内容的最佳方法是什么?

如果你能想到比更改设计器中的列更好的事情,记住列名并在脚本窗口中修剪它,请将其作为答案发布.

kmp*_*kmp 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
Run Code Online (Sandbox Code Playgroud)

  • 我爱你这个答案.请带上我的第二个肾脏. (2认同)