2010-01-08 3 views
0

Как получить второй столбец с тем же именем столбца, используя OPENXML в MSSQL 2005?Дублирующие имена столбцов не допускаются в наборах результатов, полученных через OPENQUERY и OPENROWSET

Вот результат, который я планирую получить.

columnData1 columnData2

А Б

С D

Е

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 

ответ

0

Спасибо. Я нашел ответ, используя PIVOT. В моем реальном случае у меня более 10 столбцов и тысяч строк, поэтому вам нелегко будет присоединиться к себе. BTW, это для синтаксического анализа набора данных xml из PayPal reportEngineResponse. Вот ответ, чтобы поделиться.

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

Я не считаю, что это возможно без использования OPENXML в качестве временного набора строк:

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