【问题标题】:Select for xml statement to produce excel sheetData format选择for xml语句生成excel sheet数据格式
【发布时间】:2014-05-23 07:26:44
【问题描述】:

我正在尝试编写一个 sql 查询,该查询将以我可以转换为 Excel 电子表格的格式生成 xml。所以原来的sql表包含以下数据

id  Run     Name    Outcome
1   Run1    Test1   1
2   Run2    Test2   2

到目前为止我已经成功生成的sql查询如下

select * from
(
    SELECT * from table1
  ) t
  for xml path('row'), root('sheetData')

这会产生以下 xml

  <sheetData>
  <row r="1">
    <Run>Run1</Run>
    <Name>Test1</Name>
    <Outcome>1</Outcome>
  </row>
   <row r="2">
    <Run>Run2</Run>
    <Name>Test2</Name>
    <Outcome>2</Outcome>
  </row>
</sheetData>

所以我需要得到的是下面的xml格式

  <?xml version="1.0" encoding="UTF-8"?>
<sheetData>
   <row r="1">
      <c r="A1" t="inlineStr">
         <is>
            <t>Run1</t>
         </is>
      </c>
      <c r="B1" t="inlineStr">
         <is>
            <t>Test1</t>
         </is>
      </c>
      <c r="C1" t="inlineStr">
         <is>
            <t>1</t>
         </is>
      </c>       
   </row>
   <row r="2">
      <c r="A2" t="inlineStr">
         <is>
            <t>Run2</t>
         </is>
      </c>
      <c r="B2" t="inlineStr">
         <is>
            <t>Test2</t>
         </is>
      </c>
      <c r="C2" t="inlineStr">
         <is>
            <t>2</t>
         </is>
      </c>       
   </row>
</sheetData>

现在我已经求助于对第一个 xml 格式进行转换以获得所需的输出,但是我希望构建一个 sql 查询,我可以使用它来直接生成它,而无需进行额外的转换。感谢您的帮助。

【问题讨论】:

  • 这听起来更像是一个 sql 问题,而不是 xslt 问题,因此可能值得删除 xslt 标签,并添加一个 sql(或 t-sql)标签。
  • 替换为 t-sql。谢谢指点。

标签: sql-server tsql openxml select-for-xml


【解决方案1】:

下面会做你想做的事。

DECLARE @Data TABLE (
    [id] INT,
    [Run] NVARCHAR(20),
    [Name] NVARCHAR(20),
    [Outcome] INT
)

INSERT INTO
    @Data ( [id], [Run], [Name], [Outcome] )
VALUES
    ( 1, 'Run1', 'Test1', 1 ),
    ( 2, 'Run2', 'Test2', 2 )

DECLARE @Xml XML = (
    SELECT
        [Id] AS [@r],
        (SELECT
            'A'+CONVERT(nvarchar(20), [Id]) AS [@r],
            'inlineStr' AS [@t],
            (SELECT
                [Run] AS [t]
            FOR XML PATH('is'), TYPE)
        FOR XML PATH('c'), TYPE),

        (SELECT
            'B'+CONVERT(nvarchar(20), [Id]) AS [@r],
            'inlineStr' AS [@t],
            (SELECT
                [Name] AS [t]
            FOR XML PATH('is'), TYPE)
        FOR XML PATH('c'), TYPE),

        (SELECT
            'C'+CONVERT(nvarchar(20), [Id]) AS [@r],
            'inlineStr' AS [@t],
            (SELECT
                [Outcome] AS [t]
            FOR XML PATH('is'), TYPE)
        FOR XML PATH('c'), TYPE)

    FROM
        @Data
    FOR XML PATH('row'), ROOT('sheetData'), TYPE
)
SELECT
    '<?xml version="1.0" encoding="UTF-8"?>'
    +CONVERT(NVARCHAR(MAX), @Xml)

【讨论】:

  • 这确实会产生所需的输出。不过,我需要对其进行调整,以便使其更通用,以超越四列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2012-02-29
  • 2015-12-06
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多