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

标签 sql-server xml tsql insert xquery

我想根据表中的数据在存储过程中生成一些 XML。

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

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

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

但有没有一种方法可以通过结合 select 语句并避免循环来做到这一点?

编辑 我以前使用过SELECT FOR XML 来做类似的事情,但在处理来自多个表的数据层次结构时,我总是发现它很难阅读。我希望可以使用 modify 来生成更明确、更可控的 XML。

最佳答案

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

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

一般观众的一些引用链接

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

考虑以下调用

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

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

@SpecificDogNameId  DogName
99                  Astro

But with the FOR XML PATH clause,

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 字段作为属性返回)

<Dog SpecificDogNameId=99>Astro</Dog>

嵌套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 节点(给定适当的基础数据)

<DogCollection>
    <Dog SpecificDogNameId="88">Dino</Dog>
    <Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>

从这里开始,您可以继续在嵌套树中向上工作,以构建尽可能复杂的 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 节点(给定适当的基础数据)

<AnimalCollection>
  <DogCollection>
    <Dog SpecificDogNameId="88">Dino</Dog>
    <Dog SpecificDogNameId="99">Astro</Dog>
  </DogCollection>
  <CatCollection>
    <Cat SpecificCatNameId="11">Sylvester</Cat>
    <Cat SpecificCatNameId="22">Tom</Cat>
    <Cat SpecificCatNameId="33">Felix</Cat>
  </CatCollection>
</AnimalCollection>

关于sql-server - 在 SQL Server 中,我可以将多个节点从一个表插入到 XML 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/147897/

相关文章:

mysql - 我的表在性能方面的最佳结构 :

sql-server - SQL Server批处理问题与错误处理

sql-server-2008 - 简单数据透视示例

SQL Server : calculating date ranges

sql-server - 在简单存储过程中正确使用 SCOPE_IDENTITY 函数

sql - 获取两行值不同的列名

android - 理解weight和layout_weight,layout_weight越大,在layout中缩小的越多。

c++ - 如何使用 XML 文件中的数据填充 MFC 中的列表框?

html - xhtml文档中如何使用svg命名空间

sql - 透视和交叉应用