代码之家  ›  专栏  ›  技术社区  ›  marc_s

SQL Server-尝试将列转换为XML失败

  •  3
  • marc_s  · 技术社区  · 15 年前

    我正在将旧的MySQL数据库中的数据导入到SQLServer2005中。

    我特别有一张桌子,这让我很伤心。我已经使用链接服务器和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数据类型,以便可以将其转换为XML数据类型以对其使用XQuery。

    因此,我将表选项“大数据行外”设置为1:

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

    然后我继续转换 XMLDATA VARCHAR(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。奇怪…任何-现在工作-谢谢大家的意见和建议!非常感谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ed Harper    15 年前

    如果您有足够的存储空间,可以尝试从 VARCHAR(MAX) 将表版本转换为具有相同架构但将xmldata设置为的新表 XML -要么使用 SELECT INTO 或者在开始之前显式地创建表。

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

        2
  •  1
  •   Neil Moss    15 年前

    可以添加XML类型的新列吗?

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

    编辑
    我有一个表“testtable”和一个“nvarchar(max)”列。

     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]不是零,请尝试此操作,它应将任何现有的在行字符串转换为blobs:

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

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

    从波尔,

    禁用在行中的文本选项或 降低期权的限制将 需要转换所有blob; 因此,这个过程可能很长, 取决于blob的数量 必须转换的字符串。这个 转换期间表被锁定 过程。