2012-08-06 56 views
1

我試圖在sql 2008中創建一個存儲過程,以從這樣的一些xml中選擇id值。級別1節點值的SQL xpath

DECLARE @idPolygonXML XML 

SET @idPolygonXML = 
'<polygons> 
    <id>35</id> 
    <id>36</id> 
    <id>37</id> 
    <id>38</id> 
    <id>39</id> 
    <id>40</id> 
</polygons>' 

我可以得到一個特定索引的id,但我需要所有這些,並且我不斷得到'value()需要一個singleton'。

有沒有人知道我怎麼可以得到所有這些值而不更改xml?

+0

[\ [SQL Server 2005中\]的可能重複:XML查詢( )工程,價值()需要單身發現xdt:untypedAtomic](http://stackoverflow.com/questions/1302064/sql-server-2005-xml-query-works-value-requires-singleton-found-xdtuntyp) – 2012-08-06 03:47:34

+0

是你試圖把它們全部作爲單獨的行? – dfb 2012-08-06 03:49:43

+0

是的,我需要他們的加入 – Gamma 2012-08-06 03:56:01

回答

1

看看這個:http://msdn.microsoft.com/en-us/library/ms188282.aspx

這不是測試,但您的查詢會是這個樣子

SELECT T2.ID.query('.') 
CROSS APPLY @idPolygonXML.nodes('/polygons/id') as T2(ID) 
+0

這仍然帶回節點,雖然在而不是隻是35.我可以做到這一點,但它不是很好:SELECT CAST(REPLACE(REPLACE(CAST(T2.ID.query( '。')as nvarchar(30)),'',''),'','')as int) FROM @ idPolygonXML.nodes('/ polygons/id')作爲T2(ID) – Gamma 2012-08-06 04:10:05

+1

嘗試'T2.ID.query('value(。)')' – dfb 2012-08-06 04:13:08

+0

甚至更​​簡單:使用'SELECT T2.ID.value('(。)[1]','int')'並完成它。 – 2012-08-06 04:51:14