3

我正在将数据从旧版 MySQL 数据库导入 SQL Server 2005。

我有一张特别让我伤心的桌子。我已经使用链接服务器和 MySQL ODBC 驱动程序从 MySQL 导入了它,我最终得到了这个:

Col Name          Datatype  MaxLen
OrderItem_ID       bigint      8
PDM_Structure_ID   int         4
LastModifiedDate   datetime    8
LastModifiedUser   varchar    20
CreationDate       datetime    8
CreationUser       varchar    20
XMLData            text       -1
OrderHeader_ID     bigint      8
Contract_Action    varchar    10
ContractItem       int         4

我的主要关注点是XMLData列 - 我需要清理它并制作它,以便我可以将它转换为 XML 数据类型以在其上使用 XQuery。

所以我将表选项“大数据行外”设置为1:

EXEC sp_tableoption 'OrderItem', 'large value types out of row', 1

然后我继续转换XMLDataVARCHAR(MAX)清理存储在该字段中的 XML。到目前为止一切都很好。

但是当我现在尝试将该列转换为 XML 数据类型时:

ALTER TABLE dbo.OrderItem
   ALTER COLUMN XMLData XML

我在这里收到这条消息:

消息 511,级别 16,状态 1,行 1
无法创建大小为 8077 的行,该行大于允许的最大行大小 8060。语句已终止。

这是相当令人惊讶的,看到除了XMLData唯一的列之外的列大约占 90 个字节,我特别指示 SQL Server 将所有“大数据”存储在行外......

那么到底为什么 SQL Server 拒绝将该列转换为 XML 数据???有任何想法吗??想法??我可以检查/改变我的方法的事情?

更新:我不知道发生了什么变化,但是在第二次尝试将原始数据从 MySQL 导入 SQL Server 时,我最终成功地将 NTEXT -> VARCHAR(MAX) 列转换为 XML ...... . 奇怪..... anyhoo - 现在可以使用 - 感谢大家的所有意见和建议!高度赞赏!

4

2 回答 2

1

如果您有足够的存储空间,您可以尝试从表的VARCHAR(MAX)版本中选择一个具有相同架构但 XMLData 设置为的新表XML- 在开始之前使用SELECT INTO或通过显式创建表。

PS - 这是一个与您的问题无关的附带问题,但您可能希望通过此转换检查您是否没有丢失原始 MySQL XMLData 字段中的 Unicode 字符,因为 text/varchar 数据类型不支持它们。

于 2010-08-05T10:41:21.717 回答
1

你能添加一个xml类型的新列吗?

如果是这样,请添加新的 xml 列,更新表以将新列设置为等于 XmlData 列,然后删除 XmlData 列。

编辑
我有一个带有“nvarchar(max)”列的表“TestTable”。

 select * from sys.tables where name = 'TestTable'

这给出了一个结果,其中包含:

 [lob_data_space_id] [text_in_row_limit] [large_value_types_out_of_row]
 1                   0                   0

但是我可以很高兴地在我的 nvarchar(max) 字段中保存 500k 个字符。

如果您为 OrderItems 表查询 sys.tables,您会得到什么?

如果您的 [text_in_row_limit] 不为零,请尝试此操作,它将任何现有的行内字符串转换为 BLOB:

exec sp_tableoption 'OrderItems', 'text in row', 0

然后尝试从 nvarchar(max) 切换到 xml。

从 BOL,

禁用 text in row 选项或减少选项的限制将需要转换所有 BLOB;因此,该过程可能会很长,具体取决于必须转换的 BLOB 字符串的数量。该表在转换过程中被锁定。

于 2010-08-05T10:56:42.227 回答