1

空の名前空間を持つノードを使用してXMLフィールドでXpathクエリを実行すると、SQL Server2008R2で奇妙な動作が発生しました。

このクエリは結果を返しません:

[xml_field].query('/RootNode/NodeWithEmptyNamespace')

このクエリは結果を返します:

[xml_field].query('/dft:RootNode/NodeWithEmptyNamespace')

明確にするために、このクエリは結果も返すため、ルートノード(およびおそらくデフォルトの名前空間)にプレフィックスは必須ではありません。

[xml_field].query('/RootNode')

XML名前空間によると、空の名前空間が定義されている場合のデフォルトのドキュメントでは、名前空間はnoneです。

データベースのXMLは次のとおりです。

<RootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org">
  <otherNode>Dummy data</otherNode>
  <NodeWithEmptyNamespace xmlns="">Other dummy data</NodeWithEmptyNamespace>
</RootNode>

完全なクエリ:

WITH XMLNAMESPACES ('http://tempuri.org' as dft)
SELECT TOP 150 [ID],
       [xml_field].query('/dft:RootNode/NodeWithEmptyNamespace')
  FROM [database];

誰かがこの動作の説明を持っていますか、それともこれはバグですか?

4

1 に答える 1

4

あなたの問題が何であるかは明らかではありません。RootNodeXMLサンプルを使用して、要素を投稿しました。要素otherNodeは名前空間にありますhttp://tempuri.orgが、NodeWithEmptyNamespace要素は名前空間にありません(xmlns=""そこに配置されます)。XPathを使用すると、パスまたはステップNodeWithEmptyNamespaceは名前空間なしでその名前RootNodeの要素を選択し、名前空間なしでもその名前の要素を選択します。入力にのみ、そのような要素はありません。したがって、パス/dft:RootNode/NodeWithEmptyNamespaceは正しいことを実行しています。プレフィックス(つまり)RootNodeに関連付けられた名前空間内のローカル名を持つ要素と、名前空間なしのローカル名を持つ子要素を選択します。dfthttp://tempuri.orgNodeWithEmptyNamespace

于 2013-01-08T17:26:35.217 に答える