2016-01-30 181 views
2

我有一个XML,我想解析SQL服务器。这个XML有每个游戏相关的游戏列表和规则列表。我想作为TSQL解析XML文档

 GameID RuleID RuleType IsSelected 
     380  16  0   TRUE 
     380  19  0   FALSE 
     380  17  0   FALSE 
     382  16  0   FALSE 
     382  19  0   TRUE 
     382  17  0   TRUE 

我使用下述查询来获取输出的输出,但越来越重复,每场比赛相关联的规则列表的所有元素我的游戏ID。

SELECT 
    Game.value('GameID[1]','INT') AS GameID 
    ,Game.value('IsSelected[1]','bit') AS GameSelected 
    ,Rule1.value('(./RuleID/text())[1]','Int') AS RuleID        
FROM @x.nodes('GameWorld/GameList/Game') TEMPTABLE(Game) 
OUTER APPLY 
Game.nodes('//RuleList/Rule') AS Rules(Rule1) 

XML文档如下所述。该文件包含所有游戏的列表,每个游戏都有一个与之相关的规则列表。

<GameWorld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <GameList> 
    <Game> 
     <GameID>380</GameID> 
     <IsSelected>false</IsSelected> 
     <RuleList> 
     <Rule> 
      <RuleID>16</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>true</IsSelected> 
     </Rule> 
     <Rule> 
      <RuleID>19</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>false</IsSelected> 
     </Rule> 
     <Rule> 
      <RuleID>17</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>false</IsSelected> 
     </Rule> 
     </RuleList> 
    </Game> 
    <Game> 
     <GameID>381</GameID> 
     <IsSelected>false</IsSelected> 
     <RuleList> 
     <Rule> 
      <RuleID>16</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>true</IsSelected> 
     </Rule> 
     <Rule> 
      <RuleID>19</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>false</IsSelected> 
     </Rule> 
     <Rule> 
      <RuleID>17</RuleID> 
      <RuleType>0</RuleType> 
      <IsSelected>false</IsSelected> 
     </Rule> 
     </RuleList> 
    </Game> 
    </GameList> 
</GameWorld> 

回答

1

的核心问题是因为你没有在你想要的XPath/XQuery的是相对的情况下,即在这里Game.nodes('//RuleList/Rule')//之前使用.。尝试这种方式来代替:

SELECT 
    Game.value('GameID[1]','INT') AS GameID 
    ,Rule1.value('RuleID[1]','Int') AS RuleID        
    ,Rule1.value('RuleType[1]','Int') AS RuleType 
    ,Rule1.value('IsSelected[1]','bit') AS IsSelected 
FROM @x.nodes('GameWorld/GameList/Game') TEMPTABLE(Game) 
OUTER APPLY 
Game.nodes('./RuleList/Rule') AS Rules(Rule1) 

sqlfiddle demo

输出:

| GameID | RuleID | RuleType | IsSelected | 
|--------|--------|----------|------------| 
| 380 |  16 |  0 |  true | 
| 380 |  19 |  0 |  false | 
| 380 |  17 |  0 |  false | 
| 381 |  16 |  0 |  true | 
| 381 |  19 |  0 |  false | 
| 381 |  17 |  0 |  false | 
0
SELECT 
    Game.value('GameID[1]','INT') AS GameID, 
    Rule1.value('RuleID[1]','Int') AS RuleID, 
    Rule1.value('RuleType[1]','Int') AS RuleType, 
    Rule1.value('IsSelected[1]','varchar(5)') AS IsSelected 
FROM @x.nodes('GameWorld/GameList/Game') TEMPTABLE(Game) 
OUTER APPLY 
Game.nodes('//RuleList/Rule') AS Rules(Rule1)