设计存储过程以创建XML树

时间:2008-11-07 01:53:02

标签: sql-server stored-procedures

我需要在SQL服务器中编写一个存储过程,其返回的数据将用于生成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个或更多(动态)单独的节点。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

Nesting XML-returning scalar valued functions

一旦你掌握了嵌套,并且愿意写下从下到上构建节点段所需的标量值函数的数量(我不希望这些节点段有很多),那么它不是太难了

答案 2 :(得分:0)

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

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

  • RowId的
  • ParentRowId
  • 名称
  • RowData

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

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