13

我必须将 SQL Server 2008 表中的数据类型从 varchar(max) 更改为 nvarchar(max)。该表中有数据。有没有办法在不丢失数据的情况下更改数据类型?

4

4 回答 4

17

您可以只使用标准语法来更改表:

ALTER TABLE some_table ALTER COLUMN some_column nvarchar(max)

但是,您可能希望重建任何索引,以确保它们按预期工作。

于 2012-05-15T20:28:09.760 回答
7

另一个减少中断的选择(因为我不相信ALTER COLUMN会在线发生)是:

ALTER TABLE dbo.table ADD new_column NVARCHAR(MAX); -- metadata operation

现在您可以更新 wave/batches/transactions 中的数据,而不是在一个长事务中将更改应用于整个表。当您对复制的数据感到满意时,您可以删除旧列,重命名新列,然后重新创建任何受影响的索引(您的 MAX 列不能在任何索引的键中,但您可能有无意中将其放入 INCLUDE 定义中 - 如果是这种情况,您无论如何都应该质疑)。

您仍然需要重建所有索引以回收现在未使用的空间(如果您使用的是企业版,您可以在线执行此操作)。

于 2012-05-15T20:33:01.347 回答
2

始终进行备份,这样无论发生什么,您都可以回到原来的状态。

话虽如此,从更改varchar(max)nvarchar(max)不应该丢失数据。

旁注:如果您在另一个方向更改,您可能会担心 nvarchar(max)varchar(max) 因为如果存在任何扩展字符,该过程必须转换。

于 2012-05-15T20:31:53.797 回答
0

从 SQL Server 2016 开始,这现在可以是联机操作

SQL 2016 ALTER COLUMN 在线

于 2020-02-17T15:40:41.353 回答