【问题标题】:SQL Server 2005 FOR XMLSQL Server 2005 用于 XML
【发布时间】:2010-05-12 14:40:00
【问题描述】:

我想将表中的数据导出到特定格式的 XML 文件。我对 XML 文件还很陌生,所以我所追求的可能很明显,但我在网上找不到我要找的东西。

我需要的XML结果的格式是:

    <data>
        <event 
            start="May 28 2006 09:00:00 GMT"
            end="Jun 15 2006 09:00:00 GMT"
            isDuration="true"
            title="Writing Timeline documentation"
            image="http://simile.mit.edu/images/csail-logo.gif">
            A few days to write some documentation
        </event>
     </data>

我的表结构是:

name VARCHAR(50),
description VARCHAR(255),
startDate DATETIME,
endDate DATETIME

(此时我对 XML 字段图像或 isDuration 不太感兴趣)。

我试过了:

SELECT [name]
           ,[description]
           ,[startDate]
           ,[endTime]

  FROM [testing].[dbo].[time_timeline]
  FOR XML RAW('event'), ROOT('data'), type

这给了我:

<data>
    <event name="Test1" 
           description="Test 1 Description...." 
           startDate="1900-01-01T00:00:00" 
           endTime="1900-01-01T00:00:00" 
    />
    <event name="Test2" 
           description="Test 2 Description...." 
           startDate="1900-01-01T00:00:00" 
           endTime="1900-01-01T00:00:00" 
    />
</data>

我缺少的是描述需要在事件属性之外,并且需要有一个标签。

有没有人能给我指出正确的方向,或者给我一个关于如何完成这个的教程或类似的东西?

谢谢,

马特

【问题讨论】:

    标签: xml sql-server-2005 sqlxml


    【解决方案1】:

    这应该可以完成工作:

    SELECT
        name "event/@name"
        , startDate "event/@start"
        , description "event"
    FROM
        [testing].[dbo].[time_timeline]
    FOR XML PATH(''), ROOT('data')
    

    注意事项:

    • 为了得到description作为event的文本内容,我们必须“升级”一个级别并使用PATH(''),并在所有列的别名中指定名称event
    • 所有以属性为中心的列必须位于所有非以属性为中心的列之前

    要学习这些东西(或至少了解如何做你想做的事),请参阅the docs for FOR XML,并使用你自己的表格和所需的 XML 结构。

    【讨论】:

    • 这很棒,我记得遇到过类似的东西,但无法让它工作,所以只是假设它不是我想要的。您解释它的方式将帮助我解决我必须做的其他问题。非常感谢。
    【解决方案2】:

    考虑切换到 FOR XML PATH(有关文档,请参阅 http://msdn.microsoft.com/en-us/library/ms189885.aspx

    一个非常局部的例子:

    SELECT
        [name] 
       ,[description] 
       ,[startDate]   "@start"
       ,[endTime]     "@end"
      FROM [testing].[dbo].[time_timeline] 
      FOR XML PATH('event'), ROOT('data')
    

    【讨论】:

    • 这会将description放在它自己的节点中,命名为description;以属性为中心的列也必须放在第一位。
    • 是的,我试图以一般方式演示该方法,而不是提供具体的工作示例
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多