【问题标题】:How to change every nvarchar column to varchar?如何将每个 nvarchar 列更改为 varchar?
【发布时间】:2009-12-03 19:59:45
【问题描述】:

将数据库中的每个 nvarchar 列更改为 varchar 的最简单方法是什么?

我个人更喜欢 nvarchar,但数据架构已指定必须使用 varchar。

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

    在这里,让您开始:

    Select 'Alter Table [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] Alter Column [' + COLUMN_NAME + '] VarChar(' + CAST(CHARACTER_MAXIMUM_LENGTH As VARCHAR) + ')'
    From INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE = 'NVARCHAR'
    

    这将为您生成所有需要的更改语句(剪切、粘贴、运行)。

    请注意,这不考虑任何约束。

    【讨论】:

    • +1 完美。我得到了相同的解决方案......但是查询非常丑陋和复杂......
    • @Jonathan 如何使用此答案中的代码在 SSQL Management Studio 中“生成所有需要的更改语句”,以便我可以“剪切、粘贴、运行”?
    • @emmanuel: 1) 运行这个查询; 2)转到结果窗口并剪切文本(如果您的结果窗口看起来像一个网格而不仅仅是文本,请按 Ctrl-T,然后再次运行),3)打开一个新的查询窗口,粘贴结果,确保您在正确的数据库中并执行。
    • 如果你觉得很有趣,你可以把它串起来并用一些动态 sql 运行它,但是单个 nvarchar 主键或其他约束会破坏它,可能会降低实用性。跨度>
    • 坦率地说,如果你有 nvarchar 主键,你应该遇到坏事:-)
    【解决方案2】:

    为了处理 MAX 并排除琐碎的系统图:

    SELECT 
    '
    ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] 
    ALTER COLUMN [' + COLUMN_NAME + '] 
    VARCHAR(' + 
        (CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 
            THEN 'MAX' 
            ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) 
        END)
     + ')
    '
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE = 'NVARCHAR' AND TABLE_NAME <> 'SYSDIAGRAMS'
    

    【讨论】:

      【解决方案3】:

      请数据拱手去做?

      生成系统中所有对象的脚本,然后更改 nvarchar,然后创建一个新数据库并将数据从旧数据库导入其中。

      编写更改脚本以更新现有数据库。
      (如果是生产数据库或客户端数据库,这可能是最好的方法。)

      【讨论】:

      • 第二个“要求数据拱门去做”。
      • 不要忘记先检查是否有任何数据不会转换为 varchar。我同意如果数据架构师想要这个,由他来编写脚本来完成它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多