【问题标题】:Unable to cast TEXT to XML in SQL Server无法在 SQL Server 中将 TEXT 转换为 XML
【发布时间】:2011-12-01 00:08:48
【问题描述】:

基本上我有一个名为XML 的列,其类型为TEXT;由于其他原因,这无法更改,但我想知道如何将其转换为 XML。

它给了我一个错误

XML解析:第1行,字符39,无法切换编码

尝试执行此操作时。无论如何,它周围是否仍然可以将其格式化为 XML?我真的被困在这一点上。

列内数据:

<?xml version="1.0" encoding="utf-16"?>
<Record>
     <UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid>
</Record>

这里是强制转换的 SQL 代码:

SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM tbl_Module_RequestForms_Items

【问题讨论】:

    标签: sql-server xml sql-server-2005


    【解决方案1】:

    您的问题是:您的 XML 带有 encoding="utf-16",但您的列是非 Unicode 列......

    假设您也无法将其更改为 NTEXT,您必须执行两个嵌套的 CAST 才能实现您要查找的内容:

    SELECT 
        CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
    FROM 
        tbl_Module_RequestForms_Items
    

    首先,您需要转换为NTEXT(或NVARCHAR(MAX)),然后您必须将该结果转换为XML,然后才能使用它。

    提示:删除那些“其他原因”并将其转换为 XML 数据类型,如果您确实需要将其用作 XML .....

    【讨论】:

    • 如果我尝试这种方法,则会出现“非法 xml 字符”错误。 SQL Server 2008 R2。有什么想法吗?
    • @Azimuth:听起来像是一个新问题 - 请务必发布示例 XML!
    • @Azimuth:在 SO 上提出这个问题!我相信一些 XML 专家会看到它并做出响应....
    • @marc_s,我做到了:stackoverflow.com/questions/20116205/…
    • 希望我能两次支持这个答案,非常感谢
    【解决方案2】:

    您应该将encoding="utf-16" 替换为encoding="utf-8"''(blank),然后执行您的操作。

    一个。将encoding="utf-16" 转换为encoding="utf-8"

    SELECT 
      CAST(
        REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"')
      AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
    from tbl_Module_RequestForms_Items
    

    b.将encoding="utf-16" 替换为''(blank)

    SELECT 
      CAST(
        REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', '')
      AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
    from tbl_Module_RequestForms_Items
    

    【讨论】:

    • 我希望我能将两者都标记为正确,你和 Marc_s 都有很好的方法。不过,我赞成你的。再次感谢!
    • 你好@thesandman,谢谢你的支持,我也投了你一票。我尽力以多种方式正确回答您。感谢您的宝贵时间。
    • 来回转换对我来说不起作用,但是按照这里的建议删除显式的 encoding="UTF-8" 就可以了。
    【解决方案3】:

    将 XML 变量转换为 NTEXT 可以解决问题 CAST(CAST (XML AS NTEXT) AS XML).

    【讨论】:

    • 这是一个被低估的答案。
    【解决方案4】:

    将 encoding="utf-8" 替换为 encoding="utf-16" 对我有用 :)

    【讨论】:

      【解决方案5】:

      您需要在转换为 XML 之前更改编码。

      CAST (REPLACE(MyTextToCastToXML, 'utf-8', 'utf-16') AS XML)
      

      【讨论】:

        【解决方案6】:

        您是否尝试过CONVERT 而不是CAST

        SELECT CONVERT(XML, @xml).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
        from tbl_Module_RequestForms_Items
        

        另外,请查看此页面的“xml 样式”部分;它包含转换 xml 时的一些选项:

        http://msdn.microsoft.com/en-us/library/ms187928.aspx

        【讨论】:

        • 也不起作用....四种可用样式都不起作用,因为输入基本上是 Unicode,但它存储的数据类型是非 Unicode
        猜你喜欢
        • 2010-11-02
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多