Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将列类型从ntext更改为varbinary(最大值)_Sql Server_Database_Type Conversion - Fatal编程技术网

Sql server 将列类型从ntext更改为varbinary(最大值)

Sql server 将列类型从ntext更改为varbinary(最大值),sql-server,database,type-conversion,Sql Server,Database,Type Conversion,我有一个包含ntext字段的表。表示不推荐使用ntext,并建议使用其他数据类型: 在未来版本的Microsoft SQL Server中,将删除ntext、text和image数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)、varchar(max)和varbinary(max) 在我的特殊情况下,决定切换到varbinary(max)。我试图改变表的定义,但没有成功 ALTER TABLE MyTable ALTER COLUM

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

在未来版本的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)
更改为
nvarchar(max)
->
varbinary(max)
,但这是不可能的(错误:从数据类型nvarchar(max)隐式转换为varbinary(max)不允许)


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

似乎这种转换将在某个时候发生。如果你搜索,你会发现很多人从文本转换为varchar(max),并声明转换需要20多分钟。我在研究了几分钟后得到了两分钱,所以不要把它当作福音

如果您的表只接受insert,则可以转换暂挂表中的现有数据,然后重命名这些表,这样暂挂就可以进行生产。然后在停机期间从旧表中移动任何新创建的数据


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

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


“不允许从数据类型nvarchar(max)隐式转换为varbinary(max)”意味着您必须明确转换。添加额外列可能是最好的方法。 我赞成有步骤地做这类事情,以减少风险

  • 将列varbinary(max)添加为可空
  • 修改插入代码以填充两列
  • 在你空闲的时候,比如说一夜之间,用CAST运行UPDATE语句
  • 删除旧列的所有代码支持,确保读取新列
  • 删除旧列,如果需要,将新列更改为非null

  • 是的,我在那个专栏里压缩了文字。谢谢你的回答。我想我们必须运行转换。非常感谢您的回答。这就是我现在拥有的。我一直在寻找替代方案,但我想没有。非常感谢你的回答。是的,你可能是对的。我希望有另一种方法可以做到这一点。谢谢