我想要生成某些XML在一个存储程序的数据为基础在一个表中。

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

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

这样我就可以循环中的每一条记录我的桌子,把值的我需要进入变量和执行上述声明。

但是有一样我可以这样做,只是结合一个选择声明,并避免的循环?

编辑 我有用 SELECT FOR XML 要做到类似的东西之前,但我总是觉得很难读工作时,与一个层次结构的数据从多个表格。我希望会有什么用 modify 在XML产生的更明确和更加可控制的。

有帮助吗?

解决方案

你有没有试过 筑巢 XML路标的价值的功能吗?与嵌套技术,可以刹车你SQL入非常可管理/可读的元素件

免责声明:以下,同时适于从一个工作实例,具有本身不是字面上进行测试

一些参考链接的一般观众

最简单、最低水平的嵌套节点实例

考虑下调用

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

让我们说有udfGetLowestLevelNestedNode_Specificdogname已经写入没有用于XML路条款,并为@NestedInput_SpecificDogName=99返回的单一行集记录:

@SpecificDogNameId  DogName
99                  Astro

但与XML路条款,

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>

其他提示

您能详细说明您打算做什么吗? 它只是根据表的内容生成XML数据 或者从表中添加一些数据到现有的xml结构?

关于XML的主题,有一系列精彩文章 SQLServer由Jacob Sebastian编写,它以从数据生成XML的基础知识开始表

使用sql:列而不是sql:variable。您可以在此处找到详细信息: http://msdn.microsoft.com/en -us /库/ ms191214.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top