0

我在 SQL Server 2008 中遇到了 SQLXML 的一个小问题。这是我的测试 SQL 查询

DECLARE @XMLTable TABLE(GameHistory XML)
INSERT INTO @XMLTable VALUES( '<game xmlns="http://my.name.space">
      <move>
       <player>white</player>
       <piece>pawn</piece>
       <start>A2</start>
       <end>A3</end>
      </move>
      <move>
       <player>black</player>
       <piece>pawn</piece>
       <start>D7</start>
       <end>D6</end>      
      </move>
     </game>')

SELECT GameHistory.query('/game/move[1]') FROM @XMLTable

现在,如果我取出命名空间 (xmlns="http://my.name.space") 部分,我的查询工作正常。为什么删除命名空间可以解决问题?

4

2 回答 2

2

您的 SELECT 要求元素/game/move(两者gamemove没有命名空间),而您的 xml 中没有这样的元素您需要请求正确的元素,即/game/move在 namespace 中http://my.name.space。使用WITH XMLNAMESPACES

;WITH XMLNAMESPACES(DEFAULT 'http://my.name.space')
SELECT GameHistory.query('/game/move[1]') FROM @XMLTable
于 2009-09-03T21:37:59.907 回答
1

问题是您的 XPath 没有指定名称空间,因此“游戏”元素不匹配,因为它们的名称空间不同。您需要在 XPath 中指定命名空间,以便它们匹配:

SELECT @x.query('declare namespace x="http://my.name.space"; /x:game/x:move[1]')
于 2009-09-03T21:38:27.317 回答