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

时间:2009-03-12 23:18:13

标签: sql-server database type-conversion

我有一个包含ntext字段的表格。 MSDN表示不推荐使用ntext,并建议使用其他数据类型:

  

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

在我的特定情况下,决定切换到varbinary(max)。我试图改变表定义但是没有用。

ALTER TABLE MyTable ALTER COLUMN MyColumn VARBINARY(MAX);

将类型更改为varbinary(max)有哪些可能性?我尝试从ntext - >更改类型nvarchar(max)然后来自nvarchar(max) - > varbinary(max)但这是不可能的(错误:不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换)。

唯一可行的解​​决方案是添加类型为varbinary(max)的新列,将现有值转换为新列,然后删除旧列。这花了很多时间(在我的数据集大约15GB,大约需要30分钟)。这就是为什么我正在研究实现相同的其他可能性(可能就地=没有移动数据和转换)。

3 个答案:

答案 0 :(得分:3)

我认为你使用了varbinary(max)因为你的ntext列中有非文本数据吗?在这种情况下,我认为您将不得不在表中添加单独的varbinary(max)列,然后运行转换操作以从ntext复制到新列。然后,删除旧列,并将新列重命名为旧名称。

“不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换”意味着您必须明确转换。

答案 1 :(得分:0)

似乎这种转换必须在某个时刻发生。如果你搜索,你会发现许多人从文本转到varchar(最大)并说明转换需要20多分钟。研究了几分钟后我的两分钱,所以不要把它当作福音。

如果您的表只是插入,您可以转换保留表中的现有数据,然后重命名表,以便保留然后生成。然后在停机期间从旧表中移动任何新创建的数据。

处理更新当然会使事情变得更加复杂。

答案 2 :(得分:0)

添加额外列可能是最好的方法。 我倾向于采取措施降低风险

  1. 将列varbinary(max)添加为可为空的
  2. 修改插入代码以填充两列
  3. 闲暇时,过夜说,用CAST
  4. 运行UPDATE语句
  5. 删除旧列的所有代码支持,确保读取新列
  6. 删除旧列,并根据需要将新列更改为非null