English 中文(简体)
Why OPENXML only returns one element
原标题:

Can somebody explain me why this T-SQL code only returns one row with the value "1"? I was expecting to get two rows ("1" and "2"). Am I missing something here?

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

NOTE: I m using SQL Server 2008

Thanks a lot!

最佳回答

Why don t you use the new .nodes() method on XML variables in SQL Server 2005 and up??

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)

This gives me the 1 and 2 value as expected.

问题回答

I had the same problem and I found the answer on another site. You have to use /ids/id instead of /ids and then use . in the WITH clause.

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 

Forget about the openxml non-sense, is slow, cumbersome, unusable and bad all around. Use the XML methods, they re fast, intuitive, user friendly and oozing with goodness:

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

Your xpath is to ids so id is an attribute of ids but this is not the case so you need to specify the xpath by going up the tree using .. then specify the node. a node is specified by ../id and an attribute by ../@whatever

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




相关问题
How to write this T-SQL WHERE condition?

I ve got two tables: TableA Col1 Col2 TableB Col3 Col4 I want to join them together: SELECT * from TableA join TableB ON (...) Now, in place of ... I need to write an expression ...

Customer and Order Sql Statement

TSQL query to select all records from Customer that has an Order and also select all records from customer that does not have an Order. The table Customer contains a primary key of CustomerID. The ...

Recommended way of querying multiple Versioned tables

Have a win 2003 box with MSSQL 2005 running on it. There is a database which is populated every morning with new/modified SalesOrder made the previous day. The database has several tables: SalesOrder, ...

update duplicate record

I have a table with the following fields Id Name IsPublic i need to write a sql query that updates IsPublic to false where name has a duplicate. Only one of the duplicates should have IsPublic = ...

Define variable to use with IN operator (T-SQL)

I have a Transact-SQL query that uses the IN operator. Something like this: select * from myTable where myColumn in (1,2,3,4) Is there a way to define a variable to hold the entire list "(1,2,3,4)"? ...

Selecting records during recursive stored procedure

I ve got a content management system that contains a hierarchical structure of categories, with sub-categories subject to different ordering options at each level. Currently, that s retrieved by a (...

热门标签