Sql server 2008 SQL Server:从命名空间与元素';不同的XML属性获取值;s

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

我有一个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">
      <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:更新了我的响应-这就是您要寻找的解决方案吗?是的,正是我要寻找的。我从未想过需要在名称空间前面加上“@”作为属性前缀。谢谢