【问题标题】:Duplicate column names are not allowed in result sets obtained through OPENQUERY and OPENROWSET通过 OPENQUERY 和 OPENROWSET 获取的结果集中不允许有重复的列名
【发布时间】:2010-01-08 05:52:53
【问题描述】:

如何在 MSSQL 2005 中使用 OPENXML 获得具有相同列名的第二列?

这是我计划得到的结果集。

columnData1 columnData2

甲乙

C 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

【问题讨论】:

    标签: sql-server xml paypal pivot openxml


    【解决方案1】:

    如果不使用 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
    

    【讨论】:

      【解决方案2】:

      谢谢。我通过使用 PIVOT 找到了答案。在我的真实案例中,我有超过 10 列和数千行,所以自加入并不容易。顺便说一句,这是用于解析来自 PayPal reportEngineResponse 的 xml 数据集。这里有答案分享。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 2012-08-29
        • 2013-10-06
        • 2021-03-07
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多