3

有人能解释一下为什么这个 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

非常感谢!

4

5 回答 5

11

我有同样的问题,我在另一个网站上找到了答案。您必须使用 '/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 
于 2010-10-06T15:51:37.270 回答
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”值。

于 2009-12-10T22:10:52.917 回答
7

忘记openxml的废话,它很慢,很麻烦,不可用而且很糟糕。使用XML 方法,它们快速、直观、用户友好并且非常棒:

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);
于 2009-12-10T22:10:04.817 回答
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
于 2011-08-06T07:23:13.640 回答
0

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

SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT '../id') 
于 2010-08-26T18:18:55.677 回答