【问题标题】:SQLXML in SQL serverSQL 服务器中的 SQLXML
【发布时间】:2009-09-03 21:28:22
【问题描述】:

我在 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") 部分,我的查询工作正常。为什么删除命名空间可以解决问题?

【问题讨论】:

  • 这实际上不是 SQLXML。这是 SQL Server 2005 中新增的原生 XML 数据类型。

标签: sql sql-server-2008 sqlxml


【解决方案1】:

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

;WITH XMLNAMESPACES(DEFAULT 'http://my.name.space')
SELECT GameHistory.query('/game/move[1]') FROM @XMLTable

【讨论】:

    【解决方案2】:

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

    SELECT @x.query('declare namespace x="http://my.name.space"; /x:game/x:move[1]')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2019-10-21
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多