在 SQL Server 中特定节点插入 Xml

3

我有以下代码:

@MasterXML= '
    <Report MustUnderstand="df" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:df="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily">
      <DataSets>
        <DataSet Name="'+@Datasetname+'">
          <Query>
          </Query>
          <Fields>
          <Field>
          </Field>
          </Fields>
        </DataSet>
      </DataSets>
      </Report> '
    WHILE @i <= @Cnt
    BEGIN

    Select @xml=
     (  
      SELECT  @cname AS [@Name]
               ,@cname AS [DataField]
               ,'System.String' AS [rd:TypeName]
        FOR XML PATH('Field')
    );
    SET @i = @i + 1
    SET @MasterXML.modify(' insert sql:variable("@xml") as last into  (Fields)[1] ' )  
    end
    select @MasterXML

我正在通过循环生成一个XML,我想在

后面插入它。

我尝试了SET @MasterXML.modify(' insert sql:variable("@xml") as last into (Fields)[1] ' ),但生成的字段没有增加。

有人能帮帮我吗?


我非常确定,这可以做得更好...您没有告诉我们@cname来自哪里,但是这可以在没有任何循环或.modify()的情况下完成-至少我认为如此...我的建议:有一些关于这个问题的答案。如果它们解决了问题,请接受您最喜欢的答案并行使您的投票权。然后设置一个新问题,提供更多信息,说明您真正想要实现什么。这听起来像一个xy-problem - Shnugo
2个回答

1

@MasterXML 具有默认命名空间 http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition,因此您需要使用该命名空间引用节点。

set @MasterXML.modify('
  declare default element namespace "http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition";
  insert sql:variable("@xml") as last into  (/Report/DataSets/DataSet/Fields)[1]');

请注意,您添加到@MasterXML的XML元素不使用命名空间,因此对于这些元素,将为您添加xmlns = ""。如果您希望它们成为同一命名空间的一部分,则必须在for xml查询中指定该命名空间。

使用WITH XMLNAMESPACES向查询添加命名空间


0

您的xpath表达式无效,请尝试类似以下的内容:

SET @MasterXML.modify(' insert sql:variable("@xml") as last into  (/Report/DataSets/DataSet/Fields)[1] ' )  

“the fields does not add up” 是什么意思? - Xedni
@XML部分与指定的节点不符。 - Srinivasan Rajasekaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接