【问题标题】:Create XML file in SQL with table data displayed by field instead of by record [closed]在 SQL 中创建 XML 文件,表数据按字段而不是按记录显示 [关闭]
【发布时间】:2014-07-25 15:21:20
【问题描述】:

我想从一个提取所有记录的表中创建一个 XML 文件,然后基本上将其导出到一个 XML 文件中。问题是,它需要专门格式化,以便记录按字段分解。例如,所有的 ID,然后是所有的客户姓名,然后是地址等。听起来很奇怪,但这正是我所需要的。例如在记录集中:

ID Fname Lname
1  Joe   Shmoe
2  kyle  Shoobert
3  Kernel Sanders
4  Bad    Joke

在 XML 中看起来像这样:

<root>
    <IDs>
      <key>1</key>
      <key>2</key>
      <key>3</key>
      <key>4</key>
    </IDs>
    <fnames>
      <key>Joe</key>
      <key>Kyle</key>
      <key>Kernel</key>
      <key>bad</key>
    </names>
    <lname>
      <key>Schmoe</key>
      <key>Shoobert</key>
      <key>Sanders</key>
      <key>Joke</key>
    </lname>
</root>

然后,假设他们有一个 GPA 字段,我希望 xml 有另一个字段集来计算平均值或其字段,因此每条记录都会有一个 GPA1、GPA2 等并对它们进行平均。

提前致谢。

编辑:不知道如何更清楚地了解这个问题,但看到它是如何回答的,我为那些无法理解我的措辞的人道歉。以后我会继续努力的。

【问题讨论】:

  • 是否存在技术限制,为什么无法将 XSLT 应用于 SQL Server 的输出?
  • MySQL、SQL Server、Oracle:不同
  • 为了澄清问题被搁置,我只需要一种方法来导出记录,使我能够将它们格式化为完成的 XML 文档。 Jaaz Cole 回答了这个问题,谢谢!

标签: mysql sql sql-server xml oracle


【解决方案1】:

这有点复杂,但基本上,将您的模板存储在临时表中,并在学生 ID 上的光标中使用它进行连续更新。它应该相对较快,即使对于游标也是如此,但不会像一开始就以这种方式导出数据那样快。获得正确的支点有点棘手,但希望这会有所帮助。

DECLARE @temp TABLE (ID INT PRIMARY KEY, fname VARCHAR(20), lname VARCHAR(20), GPA1 numeric(4,2), GPA2 numeric(4,2), GPAAvg AS (GPA1 + GPA2)/2.0)
INSERT INTO @temp VALUES (1, 'Joe', 'Schmoe', 3.45, 3.6)
INSERT INTO @temp VALUES (2, 'Kyle', 'Shoobert', 2.7, 4.0)
INSERT INTO @temp VALUES (3, 'Kernel', 'Sanders', 3.2, 3.8)
INSERT INTO @temp VALUES (4, 'bad', 'Joke', 3.99, 3.11)

declare @result table (r xml)
insert into @result values (N'<root>
    <IDs/>
    <fnames/>
    <lnames/>
    <GPAs1/>
    <GPAs2/>
    <Avgs/>
</root>')

declare @ID int
declare GradeCursor CURSOR FAST_FORWARD FOR
    SELECT ID
    FROM @temp
    ORDER BY ID

open GradeCursor
fetch next from GradeCursor into @ID

while @@FETCH_STATUS = 0
begin
    UPDATE RES
        SET R.modify('insert element ID {sql:column("ID")} as last into (/root/IDs)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    UPDATE RES
        SET R.modify('insert element fname {sql:column("fname")} as last into (/root/fnames)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    UPDATE RES
        SET R.modify('insert element lname {sql:column("lname")} as last into (/root/lnames)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    UPDATE RES
        SET R.modify('insert element GPA1 {sql:column("GPA1")} as last into (/root/GPAs1)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    UPDATE RES
        SET R.modify('insert element GPA2 {sql:column("GPA2")} as last into (/root/GPAs2)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    UPDATE RES
        SET R.modify('insert element Avg {sql:column("GPAAvg")} as last into (/root/Avgs)[1]')
        FROM @result RES
            inner join @temp t on t.ID = @ID
    fetch next from GradeCursor into @ID
end
close GradeCursor
deallocate GradeCursor

select * FROM @result

【讨论】:

  • 速度不是问题,幸运的是记录已经在一个表中可以使用,所以临时表不是必需的。这很棒,让我走上了正确的轨道。非常感谢您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多