【问题标题】:Convert all NCHAR columns to NVARCHAR columns in a database or table将数据库或表中的所有 NCHAR 列转换为 NVARCHAR 列
【发布时间】:2012-07-29 06:26:16
【问题描述】:

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

表和列多,测试数据量巨大。

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

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

【问题讨论】:

    标签: sql-server type-conversion


    【解决方案1】:

    我认为这样的方法可以解决问题(除非任何主键都是主键,然后您会收到错误 - 我建议您在设计器中手动执行主键,因为要更改它们,您必须删除约束等,这有点棘手)......

    它获取所有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
    

    【讨论】:

    • 上面的代码没有跳过视图。因此,在开始时对 SELECT 进行了较小的采用: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)
    • @zeeman 非常感谢 - 我的测试数据库中没有任何视图,但我们当然不想更新视图,好地方!我在答案中添加了额外的 where 子句。
    • 我爱你这个答案。请拿走我的第二个肾脏。
    猜你喜欢
    • 2022-01-19
    • 2017-02-09
    • 2011-03-27
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多