【问题标题】:How can i generate a XML without repeating an field twice如何在不重复字段两次的情况下生成 XML
【发布时间】:2016-11-08 22:24:18
【问题描述】:

我正在尝试使用以下代码生成一个 xml。但我对输出结果不满意。下面的代码我使用游标来获取要生成的 xml 的 ID,并在另一个表中更新。任何帮助表示赞赏,我是 xml 的新手。谢谢

DECLARE @xml_var XML;
DECLARE @ID INT;
DECLARE XML_CURSOR CURSOR FOR
    SELECT id
    FROM   xml_temp_table
    WHERE  id IS NOT NULL;

OPEN XML_CURSOR;
FETCH NEXT
    FROM  XML_CURSOR
    INTO  @ID;

WHILE @@FETCH_STATUS = 0
BEGIN
  SET @xml_var =
  (
         SELECT
                (
                       SELECT 'Type'    AS ID,
                              'Initial' AS VALUE,
                              ''        AS TAG,
                              'true'    AS VISIBLE,
                              Getdate() AS HISTORY,
                              ''        AS DESCRIPTION,
                              ''        AS COMMENT
                       FROM   XML_TABLE d
                       WHERE  D.XML_ID = @ID FOR XML PATH('field'),
                              TYPE ) AS 'field',
                (
                       SELECT 'OwnerName'   AS ID,
                              'Testing_XML' AS VALUE,
                              ''            AS TAG,
                              'true'        AS VISIBLE,
                              Getdate()     AS HISTORY,
                              ''            AS DESCRIPTION,
                              ''            AS COMMENT
                       FROM   XML_TABLE d
                       WHERE  D.XML_ID = @ID FOR XML PATH('field'),
                              TYPE ) AS 'field'
         FROM   XML_TABLE p
         WHERE  P.XML_ID = @ID FOR XML PATH('Material'),
                ROOT('FormValue') );
  UPDATE S
  SET    S.XML_COL = @xml_var,
  FROM   LOCATION_TABLE_XML S
  WHERE  S.ID = @ID;

  FETCH NEXT
      FROM  XML_CURSOR
      INTO  @ID;

END; 

我得到的结果是这样的

 <FormValue>
<Material>
 <field> ----- i dont want this
  <field>
    <id>Type</id>
    <value>Initial</value>
    <tag />
    <visible>true</visible>
    <history>2016-11-08T16:53:16.440</history>
    <description />
    <comment />
  </field>
  <field>
    <id>OwnerName</id>
    <value>Testing_XML</value>
    <tag />
    <visible>true</visible>
    <history>2016-11-08T16:53:16.440</history>
    <description />
    <comment />
  </field>
</field> ---- i dont want this
 </Material>
</FormValue>

但是我想要这样的结果

 <FormValue>
 <Material>
  <field>
    <id>Type</id>
    <value>Initial</value>
    <tag />
    <visible>true</visible>
    <history>2016-11-08T16:53:16.440</history>
    <description />
    <comment />
  </field>
  <field>
    <id>OwnerName</id>
    <value>Testing_XML</value>
    <tag />
    <visible>true</visible>
    <history>2016-11-08T16:53:16.440</history>
    <description />
    <comment />
  </field>
  </Material>
  </FormValue>

【问题讨论】:

  • 顺便说一句:我不认为你需要一个光标。这应该可以在正常的基于集合的操作中轻松完成。如果需要,您可以再添加一个问题,在其中提供简化的表定义以及一些示例数据行和预期输出。
  • 感谢 Shnugo,它成功了。当然,将发布另一个问题以在没有光标的情况下生成它。

标签: sql-server xml


【解决方案1】:

可能足以让AS 'field' 离开。您的FOR XML PATH('field') 将用&lt;field&gt; 元素包装每一行。

返回子选择的 XML 可以看作是像普通列一样处理的标量值。通过提供列别名,整个节点获得了一个名称,并且该名称再次转换为包装 &lt;field&gt; 元素。

您可以删除它,或将其替换为 AS [node()]AS [*]

【讨论】:

  • 我正要输入相同的内容(删除AS 'field'):)
  • 是的,这是我的一个爱好;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2018-11-03
相关资源
最近更新 更多