【问题标题】:Change data type from varchar to nvarchar for a table which has a large amount of data对于具有大量数据的表,将数据类型从 varchar 更改为 nvarchar
【发布时间】:2019-07-16 15:54:57
【问题描述】:

我需要关于如何最好地将具有 5 亿条记录的表的列数据类型从 varchar 更改为 nvarchar 的建议。

提前致谢。

【问题讨论】:

  • 嗨@Panda1122,你的问题解决了吗?如果是这样,您能否将其标记为已回答?

标签: sql sql-server sql-server-2016


【解决方案1】:

您只需要发出ALTER TABLE 声明

ALTER TABLE YourTable ALTER COLUMN YourColumn nvarchar({required length});

您需要替换大括号 ({}) 中的部分并替换为您的对象名称。

【讨论】:

  • 花了6个多小时才搞定。寻找更快的方法。
  • 看看 Alexander 的回答,@Panda1122。他提出了为什么这会变慢的原因,但是您对此无能为力;您正在对数据类型进行根本性更改,因此需要重写整个列。
【解决方案2】:

对于一个有 5 亿条记录的表。

虽然 Larnu 的回答非常正确,但由于表格的大小,我想指出这个线程:

Change datatype varchar to nvarchar in existing SQL Server 2005 database. Any issues?

和网址:http://rusanu.com/2011/10/20/sql-server-table-columns-under-the-hood/

更改将添加一个新的 NVARCHAR 列,它将更新每一行 将数据从旧的 VARCHAR 复制到新的 NVARCHAR 列,以及 然后它将旧的 VARCHAR 列标记为已删除。如果表是 很大,这将生成一个很大的日志,所以要做好准备。

不幸的是,VARCHAR()->NVARCHAR() 不仅仅是元数据的变化,所以不像 INT->BIGINT

因此,建议在维护窗口运行更改并进一步删除标记为“已删除”的列:

DBCC CLEANTABLE 
-- or
ALTER TABLE ... REBUILD

【讨论】:

    【解决方案3】:

    所以,我所做的只是, 1. 使用 nvarchar 为所需列创建一个新表 2. 使用 ssis 将现有表中的数据复制到新表中。 3. 在新表上创建约束和索引。 所有这些步骤都可以在应用程序仍在运行时完成 4.将现有表重命名为_Old,将新表重命名为现有表的名称 以上步骤几乎不需要一秒钟,并且是应用程序关闭时的唯一步骤。

    这样,我能够减少应用停机时间并成功更改列数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多