为什么OPENXML只返回一个元素

时间:2009-12-10 21:58:44

标签: sql-server xml tsql openxml

有人可以解释一下为什么这个T-SQL代码只返回一行值为“1”的行?我期待得到两行(“1”和“2”)。我在这里错过了什么吗?

DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'

DECLARE @handle2 INT

EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2

SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT 'id') 

EXEC sp_xml_removedocument @handle2

注意:我正在使用SQL Server 2008

非常感谢!

5 个答案:

答案 0 :(得分:10)

我遇到了同样的问题,我在另一个网站上找到了答案。您必须使用'/ ids / id'而不是'/ ids',然后使用'。'在WITH子句中。

DECLARE @XMLDoc2 XML 
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>' 

DECLARE @handle2 INT 

EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2 

SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.')  

EXEC sp_xml_removedocument @handle2 

答案 1 :(得分:9)

为什么不在SQL Server 2005及更高版本中对XML变量使用新的.nodes()方法?

DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'


SELECT
   ids.id.value('.', 'int') 'id'
FROM 
   @xmldoc2.nodes('/ids/id') ids(id)

这给了我预期的“1”和“2”值。

答案 2 :(得分:7)

忘记openxml无意义,缓慢,繁琐,无法使用和全面坏。使用XML methods,它们快速,直观,用户友好,并且善于渗透:

DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'

select x.value(N'.', N'int') as id
from @XMLDoc2.nodes(N'/ids/id') t(x);

答案 3 :(得分:2)

DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
DECLARE @handle2 INT
EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.') 
EXEC sp_xml_removedocument @handle2

答案 4 :(得分:0)

你的xpath是id,所以id是ids的一个属性,但事实并非如此,所以你需要这样做 通过使用..向上运行树来指定xpath,然后指定节点。节点由../id指定,属性由../@whatever指定

SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT '../id')