我正在对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;
错误:
Msg 9314,Level 16,State 1,Line 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)| element(ns {http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume}:Name.First,xs:anyType))?'。
我有一些基本的理解,我在这里失踪,但我不确定它是什么。有人可以开导我吗?为什么第二个查询会返回错误?
答案 0 :(得分:1)
对于SQL Server表中的每一行,您的XPath表达式可能会导致返回多行。您需要使用CROSS APPLY
并致电.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)
这应该返回表中每行的JobCandidateID
XML列中定义的所有Resume
值和所有名字。
如果您可以确定XML列中只有一个<name>
标记,那么您还可以将其缩短为:
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