2010-01-08 14 views
0

Comment puis-je obtenir la deuxième colonne avec le même nom de colonne en utilisant OPENXML dans MSSQL 2005?Les noms de colonne en double ne sont pas autorisés dans les ensembles de résultats obtenus avec OPENQUERY et OPENROWSET

Voici le jeu de résultats que je prévois d'obtenir.

columnData1 columnData2

A B

C D

E F

DECLARE @hDoc int, @xmldata varchar(max) 
SELECT @xmldata = 

'<?xml version="1.0" encoding="utf-8" ?> 
<reportResponse> 
<reportDataRow rowNum="1"> 
<columnData colNum="1"> 
    <data>A</data> 
</columnData> 
<columnData colNum="2"> 
    <data>B</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="2"> 
<columnData colNum="1"> 
    <data>C</data> 
</columnData> 
<columnData colNum="2"> 
    <data>D</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="3"> 
<columnData colNum="1"> 
    <data>E</data> 
</columnData> 
<columnData colNum="2"> 
    <data>F</data> 
</columnData> 
</reportDataRow> 
</reportResponse>' 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata 

SELECT * 
FROM OPENXML(@hDoc, '/reportResponse/reportDataRow',2) 
WITH (columnData varchar(50) , columnData2 varchar(50)) 


SELECT * 
FROM OPENXML(@hDoc, '/reportResponse/reportDataRow/columnData',2) 
WITH (data varchar(50)) 

EXEC sp_xml_removedocument @hDoc 

Répondre

0

Merci. J'ai trouvé la réponse en utilisant PIVOT. Dans mon cas réel, j'ai plus de 10 colonnes et des milliers de lignes, il ne sera donc pas facile de se joindre à moi. BTW, c'est pour analyser l'ensemble de données XML de PayPal reportEngineResponse. Voici la réponse à partager.

DECLARE @hDoc INT, @xmldata VARCHAR(MAX) 
SELECT @xmldata = 

'<?xml version="1.0" encoding="utf-8" ?> 
<reportResponse> 
<reportDataRow rowNum="1"> 
<columnData colNum="1"> 
    <data>A</data> 
</columnData> 
<columnData colNum="2"> 
    <data>B</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="2"> 
<columnData colNum="1"> 
<data>C</data> 
</columnData> 
<columnData colNum="2"> 
<data>D</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="3"> 
<columnData colNum="1"> 
<data>E</data> 
</columnData> 
<columnData colNum="2"> 
<data>F</data> 
</columnData> 
</reportDataRow> 
</reportResponse>' 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata 

SELECT [1] as row1, [2] as row2 
FROM 
(SELECT * 
FROM OPENXML(@hDoc, '/reportResponse/reportDataRow/columnData',2) 
WITH (data VARCHAR(50) 
,rowNum INT  '../@rowNum' 
,colNum INT  '@colNum')) P 
PIVOT 
(
MAX(data) 
FOR colNum IN ([1],[2]) 
)AS pvt 

EXEC sp_xml_removedocument @hDoc 
0

Je ne pense pas que ce soit possible sans utiliser OPENXML comme rowset intermédiaire:

DECLARE @hDoc INT, @xmldata VARCHAR(MAX) 
SELECT @xmldata = 

'<?xml version="1.0" encoding="utf-8" ?> 
<reportResponse> 
<reportDataRow rowNum="1"> 
<columnData colNum="1"> 
    <data>A</data> 
</columnData> 
<columnData colNum="2"> 
    <data>B</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="2"> 
<columnData colNum="1"> 
    <data>C</data> 
</columnData> 
<columnData colNum="2"> 
    <data>D</data> 
</columnData> 
</reportDataRow> 
<reportDataRow rowNum="3"> 
<columnData colNum="1"> 
    <data>E</data> 
</columnData> 
<columnData colNum="2"> 
    <data>F</data> 
</columnData> 
</reportDataRow> 
</reportResponse>' 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata 

;WITH xmlCTE 
AS 
(
     SELECT * 
     FROM OPENXML(@hDoc, '/reportResponse/reportDataRow/columnData',2) 
     WITH (DATA VARCHAR(50) 
      ,rowNum INT  '../@rowNum' 
      ,colNum INT  '@colNum') 
) 
SELECT c1.DATA AS columnData1 
     ,c2.DATA AS columnData2 
FROM xmlCTE AS c1 
JOIN xmlCTE AS c2 
ON c1.rowNum = c2.rowNum 
AND c2.colNum = 2 
WHERE c1.colNum = 1 

EXEC sp_xml_removedocument @hDoc