2009-12-10 2 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

Почему вы не использовать новые .nodes() метод на переменных XML в 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 ..... ???? –

+2

Ну, я очень торопился раскачиваться «сочиться добра», мне нравится его звук;) –

+1

't.x.value' или' x.value', оба работают (я даже тестировал до того, как я разместил!). 't' является псевдонимом таблицы в этом контексте и не требуется, потому что существует только один возможный' x', поэтому имя может быть разрешено однозначно. –

0

Ваш xpath - это идентификаторы, так что 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 
Смежные вопросы