使用T-SQL将表转换为带有属性的XML

时间:2017-07-19 19:21:23

标签: sql sql-server xml tsql

我正在尝试转换表格:

  • tblCustomAttributeSourceSchema包含COLUMN DEFINITIONS和
  • tblLabelAttributes,其中包含每个列的VALUES

为方便起见,我在这个sqlfiddle中创建了表格:

http://www.sqlfiddle.com/#!6/b2fde/1

我想将其转换为包含" LabelID"的表格。 (INT类型 - 最初来自tblLabelAttributes)和" XML_VALUE" (类型为XML),如下例所示。因此对于labelID = 688,它应该是:

 <attributes>
  <attribute attribute_id="1" value="2.00" />
  <attribute attribute_id="2" value="3.00" />
  <attribute attribute_id="3" value="60.00"/>
</attributes>

"attribute_id"应设置为tblCustomAttributeSourceSchema的AttributeID,"value"应设置为tblLabelAttributes中的值。

如果属性值在&#39;&#39; tblLabelAttributes&#34;&#39;那么&#34;属性&#34;该LabelID的XML中应该缺少记录。

我对SQL Server中的XML功能不太熟悉。我正在寻找如何将数据转换为这样的XML。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在查询中使用FOR XML:

SELECT *
FROM tblCustomAttributeSourceSchema FOR XML AUTO

SELECT *
FROM tblLabelAttributes FOR XML AUTO

或者,您可以在t-sql代码中创建自己的XML:

SELECT LabelID AS "@LabelID",
       col1 AS "Attributes/col1",
       col2 AS "Attributes/col2"
FROM tblLabelAttributes
FOR XML PATH('LabelID')

给出这样的输出:

<LabelID LabelID="688">
   <Attributes>
      <col1>2.00</col1>
      <col2>3.00</col2>
   </Attributes>
</LabelID>

答案 1 :(得分:1)

如果代码完全像你的小提琴那么你似乎有一些问题:

  1. 数据是透视的,因此您最好将其取消。
  2. 您没有属性的种子编号,因此您需要创建该编号。
  3. 我仍然没有得到你如何使用第一张表。
  4. 我为我的工作做了很多xml解析和创建,所以这里是我如何做的一个例子:

    ; WITH d AS 
      (
      SELECT 
       *
      , ROW_NUMBER() OVER(PARTITION BY LabelId ORDER BY val) AS rwn
      FROM tblLabelAttributes
      UNPIVOT (val FOR col IN (col1, col2, col3)) AS upvt
      )
    , distincts AS 
      (
      SELECT DISTINCT LabelId
      FROM d
      )
    Select 
      LabelId AS "@LabelId"
    , (
      SELECT 
        val AS "@value"
      , rwn AS "@attribute_id"
      FROM d y
      WHERE y.LabelId = x.LabelId
      FOR XML PATH('attribute'), TYPE
      )
    From distincts x
    FOR XML PATH('attributes'), ROOT('ROOT')
    

    一般来说,嵌套选择适用于xml创建,因为您有时需要显示子节点关系,而IMHO它们可以很好地为此工作,在where子句中对外部对象连接执行内部对象。您还可以通过某些部分注释掉“for xml ...”来判断您正在做什么的级别。一个好的xml结构我通常从最低的节点构建,然后上到树上。这样,如果我需要调试一些东西,我可以注释掉最后一段,并看到多行上存在一段xml。在这个例子中,如果我注释掉最后一行,分组将是'LabelId'。

    略微调整的版本以符合问题中的规范:

    ; WITH d AS 
      (
      SELECT 
       *
      , ROW_NUMBER() OVER(PARTITION BY LabelId ORDER BY val) AS rwn
      FROM tblLabelAttributes
      UNPIVOT (val FOR col IN (col1, col2, col3)) AS upvt
      )
    , distincts AS 
      (
      SELECT DISTINCT LabelId
      FROM d
      )
    Select 
      LabelId AS "@LabelId"
    , (
      SELECT 
        val AS "@value"
      , rwn AS "@attribute_id"
      FROM d y
      WHERE y.LabelId = x.LabelId
      FOR XML PATH('attribute'), TYPE, ROOT('attributes')
      ) 
    From distincts x