在特定节点SQL Server上插入Xml

时间:2018-03-28 02:29:27

标签: sql-server xml

我有以下代码,

@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

我正在通过循环生成XMLat @xml,我希望在

之后插入它

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分: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查询中指定它。

Add Namespaces to Queries with WITH XMLNAMESPACES

答案 1 :(得分:0)

您的xpath表达式无效。尝试这样的事情:

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