【问题标题】:Designing a Stored procedure to create XML tree设计存储过程以创建 XML 树
【发布时间】:2008-11-07 01:53:01
【问题描述】:

我需要在 SQL Server 中编写一个存储过程,其返回的数据将用于生成 XML 文件。

我的 XML 文件的结构是

<root>
<ANode></ANode>
<BNode></BNode>
<CNode>
  <C1Node>
    <C11Node></C11Node>
    <C12Node></C12Node>
  </C1Node>
  <C2Node>
    <C21Node></C21Node>
    <C22Node></C22Node>
  </C2Node>
  <C3Node>
    <C31Node></C31Node>  
    <C32Node></C32Node>  
  </C3Node>  
</CNode>
</root>

我的问题是,在存储过程中,我们可以选择 ANode 和 BNode 的值作为简单的 SELECT 语句,如

Select ANodeVal,BNodeVal from Table

但是如何设计存储过程来获取 CNode 的记录,CNode 是一个子树,除了正常的 ANode 和 BNode 之外,每个记录中都有 3 个或更多(动态)单独的节点。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

      Nesting XML-returning scalar valued functions

    一旦你掌握了嵌套的窍门,并且愿意编写自下而上构造节点段所需的标量值函数的数量(我不希望有很多这样的东西),那么它就不会了太难了。

    【讨论】:

      【解决方案2】:

      我不建议在存储过程中执行此操作。如果使用 C#/Python 或 Java 等语言创建,则代码可单元测试且更易于维护。

      【讨论】:

        【解决方案3】:

        如果您能够修改数据库设计,请考虑将每个节点保留为记录,而不是列(如示例 select 语句所示)。

        例如,每一行可能包含以下字段:

        • 行 ID
        • ParentRowId
        • 姓名
        • 行数据

        我假设您将数据传递给应用程序,因为您指出返回的数据将用于生成 XML。在这种情况下,存储过程将只是一个 SELECT 语句,将格式留给应用程序。

        XML 引擎的大多数实现应该允许您将子节点添加到现有父节点。 XML 在内存中构建,然后通过任何必要的方法“导出”以获得所需的最终结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 2011-09-11
          • 2016-11-11
          相关资源
          最近更新 更多