2009-12-10 56 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 
相關問題