Повторяющиеся имена столбцов не допускаются в наборах результатов, полученных с помощью OPENQUERY и OPENROWSET - PullRequest
0 голосов
/ 08 января 2010

Как я могу получить второй столбец с тем же именем столбца, используя OPENXML в MSSQL 2005?

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

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

Ответы [ 2 ]

0 голосов
/ 08 января 2010

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

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 голосов
/ 08 января 2010

Я не думаю, что это возможно без использования 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
...