2009-09-03 34 views
0

这里是我的测试SQL查询SQLXML在我在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://我的。 name.space“)部分我的查询工作正常。为什么删除命名空间解决了这个问题?

+0

这实际上不是SQLXML。这是原生的XML数据类型,从SQL Server 2005起就是新的。 – 2009-09-03 21:30:09

回答

2

你的SELECT询问元素/game/move(其中两个gamemove没有命名空间),并且您没有在你的XML有这样的元素。您需要询问正确的元素,即命名空间http://my.name.space中的/game/move。使用WITH XMLNAMESPACES

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

非常感谢您的解决方案!我对这个东西太陌生了。 – Matt 2009-09-03 21:53:04

+0

+1。我不知道那件事。 – David 2009-09-03 22:16:16

1

的问题是,你的XPath不指定一个名称空间,这样的“游戏”的元素不匹配,因为它们的命名空间是不同的。您需要在XPath中指定命名空间以使它们匹配:

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

+1在xquery/xpath中声明名称空间也是正确的 – 2009-09-03 21:41:56