2012-08-06 65 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