当前位置:  开发笔记 > Android > 正文

在SQL Server中,我可以从表中将多个节点插入XML吗?

如何解决《在SQLServer中,我可以从表中将多个节点插入XML吗?》经验,为你挑选了1个好方法。

我想基于表中的数据在存储过程中生成一些XML.

以下插入允许我添加许多节点,但它们必须是硬编码或使用变量(sql:variable):

SET @MyXml.modify('
      insert
         
            {sql:variable("@MyVariable")}
         
      into (/root[1]) ') 

所以我可以循环遍历表中的每个记录,将我需要的值放入变量并执行上面的语句.

但是,有一种方法可以通过与select语句结合并避免循环来实现这一点吗?

编辑我之前曾经SELECT FOR XML 做过类似的事情,但是在处理来自多个表的数据层次结构时,我总是觉得很难阅读.我希望有一些东西可以使用modifyXML生成的地方更明确,更可控.



1> 6eorge Jetso..:

您是否尝试过嵌套 FOR XML PATH标量值函数?使用嵌套技术,您可以将SQL制作成非常易于管理/可读的元素

免责声明:以下内容虽然改编自一个工作示例,但本身并未进行过字面测试

一般受众的一些参考链接

http://msdn2.microsoft.com/en-us/library/ms178107(SQL.90).aspx

http://msdn2.microsoft.com/en-us/library/ms189885(SQL.90).aspx

最简单,最低级别的嵌套节点示例

考虑以下调用

DECLARE  @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] 
(@NestedInput_SpecificDogNameId)

假设在没有FOR XML PATH子句的情况下编写了udfGetLowestLevelNestedNode_SpecificDogName,并且对于@NestedInput_SpecificDogName = 99,它返回单行集记录:

@SpecificDogNameId  DogName
99                  Astro

但是使用FOR XML PATH子句,

CREATE FUNCTION dbo.udfGetLowestLevelNestedNode_SpecificDogName
(
@NestedInput_SpecificDogNameId
)
    RETURNS XML
    AS
    BEGIN

        -- Declare the return variable here
        DECLARE @ResultVar XML

        -- Add the T-SQL statements to compute the return value here
        SET @ResultVar =
            (
            SELECT 
                  @SpecificDogNameId as "@SpecificDogNameId",
                  t.DogName 
            FROM tblDogs t
            FOR XML PATH('Dog')
            )

        -- Return the result of the function
        RETURN @ResultVar

END

用户定义的函数生成以下XML(@符号使得SpecificDogNameId字段作为属性返回)

Astro

嵌套XML类型的用户定义函数

用户定义的函数(如上面的udfGetLowestLevelNestedNode_SpecificDogName)可以嵌套,以提供生成复杂XML的强大方法.

例如,功能

CREATE FUNCTION [dbo].[udfGetDogCollectionNode]()
    RETURNS XML
    AS
    BEGIN

        -- Declare the return variable here
        DECLARE @ResultVar XML

        -- Add the T-SQL statements to compute the return value here
        SET @ResultVar =
            (
                SELECT  
                [dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
                        (t.SpecificDogNameId)
                FROM tblDogs t

                FOR XML PATH('DogCollection') ELEMENTS
            )
        -- Return the result of the function
        RETURN @ResultVar

END

当被调用为

SELECT [dbo].[udfGetDogCollectionNode]()

可能会产生复杂的XML节点(给定适当的底层数据)


    Dino
    Astro

从这里开始,您可以继续在嵌套树中向上工作,以便根据需要构建复杂的XML结构

CREATE FUNCTION [dbo].[udfGetAnimalCollectionNode]()
RETURNS XML
AS
BEGIN

DECLARE @ResultVar XML

SET @ResultVar =
(
SELECT 
dbo.udfGetDogCollectionNode(),
dbo.udfGetCatCollectionNode()
FOR XML PATH('AnimalCollection'), ELEMENTS XSINIL
)

RETURN @ResultVar

END

当被调用为

SELECT [dbo].[udfGetAnimalCollectionNode]()

udf可能会产生更复杂的XML节点(给定适当的底层数据)


  
    Dino
    Astro
  
  
    Sylvester
    Tom
    Felix
  

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有