4

我正在对 SQL Server 2012 中的 XML 数据类型列执行查询。数据示例如下:

<ns:Resume xmlns:ns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume">
  <ns:Name>
    <ns:Name.Prefix></ns:Name.Prefix>
    <ns:Name.First>Shai</ns:Name.First>
    <ns:Name.Middle></ns:Name.Middle>
    <ns:Name.Last>Bassli</ns:Name.Last>
    <ns:Name.Suffix></ns:Name.Suffix>
  </ns:Name>
  ...
</ns:Resume>

我正在尝试编写一个查询来返回名字。

此查询按预期返回名字列表:

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
SELECT [Resume].query('(//ns:Name.First)').value('.[1]', 'nvarchar(100)')
FROM   HumanResources.JobCandidate;

但是,此查询返回错误:

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
SELECT [Resume].value('(//ns:Name.First)[1]', 'nvarchar(100)')
FROM   HumanResources.JobCandidate;

错误:

消息 9314,级别 16,状态 1,行 2
XQuery [HumanResources.JobCandidate.Resume.value()]:无法隐式原子化或将“fn:data()”应用于复杂内容元素,在推断中找到类型“xs:anyType”类型'(元素(ns{ http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume }:Name.First,xs:string)| 元素(ns{ http://schemas.microsoft .com/sqlserver/2004/07/adventure-works/Resume }:Name.First,xs:anyType)) ?'。

我在这里缺少一些基本的理解,但我不确定它是什么。有人可以启发我吗?为什么第二个查询返回错误?

4

1 回答 1

1

对于 SQL Server 表中的每一行,您的 XPath 表达式可能会导致返回多行。您需要使用 aCROSS APPLY和 a.nodes()来获取所需的信息:

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
SELECT 
    JobCandidateID,
    ResNames.value('(ns:Name.First)[1]', 'nvarchar(100)')
FROM   
    HumanResources.JobCandidate
CROSS APPLY
    [Resume].nodes('/ns:Resume/ns:Name') AS XTbl(ResNames)

这应该返回表中每一行的 XML 列中JobCandidateID定义的所有值和所有名字。Resume

如果您可以确定<name>您的 XML 列中只会有一个标签,那么您也可以将其缩短为:

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume' AS ns)
SELECT 
    JobCandidateID,
    [Resume].value('(/ns:Resume/ns:Name/ns:Name.First)[1]', 'nvarchar(100)')
FROM   
    HumanResources.JobCandidate
于 2013-06-29T13:58:00.843 回答