2009-12-10 103 views
3

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

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中

非常感谢!

回答

9

你为什么不使用XML的变量,新的.nodes()方法,在SQL Server 2005和最多?

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'值。

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); 
+0

应该不是被'选择t.x.value .....'???? – 2009-12-10 22:11:49

+2

那么,我很急于推出'天生渗透',我喜欢它的声音;) – 2009-12-10 22:17:11

+1

't.x.value'或'x.value',这两个工作(我甚至在我发布前测试过!)。 't'是这个上下文中的一个表别名,并不是必需的,因为只有一个可能的'x',所以名字可以毫不含糊地解析。 – 2009-12-10 22:18:27

0

您的xpath是ID,所以ID是ID的属性,但事实并非如此,所以您需要 通过使用..向上指定Xpath,然后指定节点。一个节点由../id和属性指定由../@whatever

SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT '../id') 
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 
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 
相关问题