Sql server 2008 SQL Server:从命名空间与元素';不同的XML属性获取值;s
我有一个xml,其中很少有具有名称空间的属性,但它们与它们所属元素的名称空间不同 示例Xml:Sql server 2008 SQL Server:从命名空间与元素';不同的XML属性获取值;s,sql-server-2008,Sql Server 2008,我有一个xml,其中很少有具有名称空间的属性,但它们与它们所属元素的名称空间不同 示例Xml: <d:dataroot xmlns:m="urn:schemas-microsoft-com:xml-m" xmlns:d="urn:schemas-microsoft-com:xml-d"> <Books xmlns="http://tempuri.org/Books.xsd"> <Book d:id="1" m:name="Book1" isbn="123
<d:dataroot xmlns:m="urn:schemas-microsoft-com:xml-m" xmlns:d="urn:schemas-microsoft-com:xml-d">
<Books xmlns="http://tempuri.org/Books.xsd">
<Book d:id="1" m:name="Book1" isbn="123">
<Author>John</Author>
</Book>
<Book d:id="2" m:name="Book2" isbn="124">
<Author>John</Author>
</Book>
</Books>
</d:dataroot>
尝试了不同的方法为查询中的属性指定命名空间,但未成功
有人知道如何查询与它所在的元素具有不同命名空间的xml属性吗?谢谢。您需要非常小心使用XML名称空间
元素定义了一个应用于此顶级元素的d
XML名称空间,但它下面的
定义了一个新的默认XML名称空间http://tempuri.org/Books.xsd
适用于此节点及其子节点的
因此,您需要使用此查询来获取数据:
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d,
'http://tempuri.org/Books.xsd' AS ns)
SELECT *
FROM #TestXml
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@isbn="124"]') = 1
更新:如果要基于@id
属性,请使用以下命令:
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d,
'http://tempuri.org/Books.xsd' AS ns)
SELECT *
FROM #TestXml
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@d:id="1"]') = 1
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d,
'urn:schemas-microsoft-com:xml-m' AS m,
'http://tempuri.org/Books.xsd' AS ns)
SELECT *
FROM #TestXml
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@m:name="Book1"]') = 1
如果要基于@name
属性,请使用以下命令:
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d,
'http://tempuri.org/Books.xsd' AS ns)
SELECT *
FROM #TestXml
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@d:id="1"]') = 1
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d,
'urn:schemas-microsoft-com:xml-m' AS m,
'http://tempuri.org/Books.xsd' AS ns)
SELECT *
FROM #TestXml
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@m:name="Book1"]') = 1
谢谢,但是使用isbn运行查询不是问题。问题在于在查询中使用属性id和名称,因为它们具有不同的命名空间。@TonyStark:更新了我的响应-这就是您要寻找的解决方案吗?是的,正是我要寻找的。我从未想过需要在名称空间前面加上“@”作为属性前缀。谢谢