【发布时间】:2019-07-16 15:54:57
【问题描述】:
我需要关于如何最好地将具有 5 亿条记录的表的列数据类型从 varchar 更改为 nvarchar 的建议。
提前致谢。
【问题讨论】:
-
嗨@Panda1122,你的问题解决了吗?如果是这样,您能否将其标记为已回答?
标签: sql sql-server sql-server-2016
我需要关于如何最好地将具有 5 亿条记录的表的列数据类型从 varchar 更改为 nvarchar 的建议。
提前致谢。
【问题讨论】:
标签: sql sql-server sql-server-2016
您只需要发出ALTER TABLE 声明
ALTER TABLE YourTable ALTER COLUMN YourColumn nvarchar({required length});
您需要替换大括号 ({}) 中的部分并替换为您的对象名称。
【讨论】:
对于一个有 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
【讨论】:
所以,我所做的只是, 1. 使用 nvarchar 为所需列创建一个新表 2. 使用 ssis 将现有表中的数据复制到新表中。 3. 在新表上创建约束和索引。 所有这些步骤都可以在应用程序仍在运行时完成 4.将现有表重命名为_Old,将新表重命名为现有表的名称 以上步骤几乎不需要一秒钟,并且是应用程序关闭时的唯一步骤。
这样,我能够减少应用停机时间并成功更改列数据类型。
【讨论】: