将列类型从ntext更改为varbinary(max)

6
我有一个包含ntext字段的表。根据MSDNntext已被弃用且建议使用其他数据类型:

在未来的Microsoft SQL Server版本中,ntext、text和image数据类型将被移除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)、varchar(max)和varbinary(max)。

在我的特定情况下,决定切换到varbinary(max)。我尝试修改表定义,但没有成功。
ALTER TABLE MyTable ALTER COLUMN MyColumn VARBINARY(MAX);

有什么可能将类型更改为varbinary(max)吗?我试过从ntext改变类型,然后从nvarchar(max) -> varbinary(max),但这是不可能的(错误:不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换)。唯一可行的解决方案是添加一个新的varbinary(max)类型列,将现有值转换到新列,然后删除旧列。这需要太长时间(在我的大约15GB的数据集上需要约30分钟)。这就是为什么我正在研究其他实现相同目标的可能性(可能是原地实现=无需移动数据和转换)。
3个回答

4
我猜你选择了varbinary(max)是因为你的ntext列中含有非文本数据?如果是这样,我认为你需要在表中添加一个单独的varbinary(max)列,然后运行转换操作将数据从ntext复制到新列。接着,删除旧列并将新列重命名为旧名称。
“从数据类型nvarchar(max)到varbinary(max)的隐式转换不被允许”意味着你需要明确指定转换方式。

是的,我在那一列压缩了文本。 - David Pokluda
谢谢你的回答。我想我们将不得不运行转换。 - David Pokluda

0

看起来这种转换迟早要发生。如果你搜索一下,会发现很多人将文本转换为varchar(max),并且声称转换需要20多分钟。经过几分钟的研究,这是我的看法,不要把它当作教条。

如果你的表只进行插入操作,你可以在一个临时表中转换现有数据,然后重命名表,使临时表变成正式表。在你的停机时间期间,将任何新创建的数据从旧表移动到新表中。

当然,处理更新操作会使事情更加复杂。


非常感谢您的回答。是的,您可能是正确的。我希望有另一种方法来解决这个问题。谢谢。 - David Pokluda

0

添加额外的列可能是最好的方法。 我倾向于分步骤进行此类操作以降低风险

  1. 添加可为空的 varbinary(max) 列
  2. 修改插入代码以填充两个列
  3. 在您方便的时候,比如过夜,运行带有 CAST 的 UPDATE 语句
  4. 删除旧列的所有代码支持,确保读取新列
  5. 删除旧列,并根据需要将新列更改为非空

非常感谢您的回答。这是我目前拥有的。我在寻找一种替代方案,但我想没有。 - David Pokluda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接