【问题标题】:SQL Query - Querying XML, having issuesSQL 查询 - 查询 XML,有问题
【发布时间】:2014-07-08 04:00:50
【问题描述】:

我正在处理一个项目,需要一些帮助才能使这个 XML 查询正常工作。我正在尝试在 SQL 中将下面的 XML 查询为带有公司值的新列“公司”。

列名是CustomData,并且是varchar(3000),所以看起来需要将其转换为XML,除非有其他方法可以做到这一点。

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfCustomData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <CustomData name="Company" value="WT001" />
   <CustomData name="Location" value="123456" />
   <CustomData name="DealerCode" value="WT" />
   <CustomData name="Domain" value="WT" />
   <CustomData name="Region" value="1234" />
</ArrayOfCustomData>

这是我正在使用的 SQL 代码。

select CustomData.value('(/ArrayOfCustomData/CustomData name="Company")[1]','varchar(30)') as Company
from tbl_User_Ref

我得到这个错误:

“找不到列“CustomData”或用户定义的函数或聚合“CustomData.value”,或者名称不明确。”

感谢任何帮助。

谢谢!

【问题讨论】:

  • 这对您来说可能很明显,但是您希望它如何找到“CustomData”列?列中的 XML sn-p 是这样命名的吗?
  • 是的,这也是列的名称。

标签: sql xml


【解决方案1】:

您的 XPath 无效,请尝试以下方法:

select 
    CustomData.value('(/ArrayOfCustomData/CustomData[@name="Company"]/@value)[1]','varchar(30)') as Company
from tbl_User_Ref

注意在属性名称的开头使用@ 来处理XML 属性,以及使用方括号([....]) 中的表达式来过滤XML 数据(通过@ 的值过滤&lt;CustomData&gt; 987654327@属性具体)。

更新:

如果您使用的是 SQL Server,您可以使用CAST() 函数将列转换为 XML 类型,例如:

select 
    (CAST(CustomData as xml)).
            value('(/ArrayOfCustomData/CustomData[@name="Company"]/@value)[1]','varchar(30)') as Company
from tbl_User_Ref

SQL Fiddle demo

使用 CTE 的另一种方法:Select XML from varchar(max) column

【讨论】:

  • 我试过了,但我仍然收到相同的错误消息。 CustomData.value 带有红色下划线,但其他一切似乎都很好。还有什么需要补充的吗? “找不到列“CustomData”或用户定义的函数或聚合“CustomData.value”,或者名称不明确。”
  • 看来CustomData这个列连XML都不是,是varchar(3000),所以我觉得需要先转成XML再查询。
  • 我用您添加的新代码再次尝试查询,现在我得到“XML 解析:第 1 行,字符 39,无法切换编码”我觉得我越来越接近了..
  • @user3460072 如果您从具有 UTF-16 编码的 XML 的 varchar 字符串进行转换,或者从具有 UTF 的 nvarchar 进行转换,则可能会发生这种情况-8 编码的 XML。在问题中,您说该列是 varchar,而 XML 是 UTF-8,所以应该可以正常工作。也许您的列是 nvarchar 或者您混合了 UTF-16 和 UTF-8 编码的 XML。
【解决方案2】:

我设法通过使用下面的代码使其工作。不知道为什么,但看起来我的 XML 实际上是 UTF-16 而不是 UTF-8,这也可能给我带来了问题。感谢您的帮助。

CAST(CAST(CustomData AS NTEXT) AS XML).value('(/ArrayOfCustomData/CustomData[@name="Company"]/@value)[1]','varchar(3000)') as Company

【讨论】:

    【解决方案3】:

    声明@DocHandle int

    声明@XmlDocument nvarchar(1000)

    SET @XmlDocument = N'请输入您的查询(XML)'

    EXEC sp_xml_preparedocument @DocHandle 输出,@XmlDocument

    选择 * FROM OPENXML (@DocHandle, '/ArrayOfCustomData/CustomData',1) WITH (名称 varchar(10), 值 varchar(20))

    EXEC sp_xml_removedocument @DocHandle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      相关资源
      最近更新 更多