我正在尝试转换表格:
为方便起见,我在这个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。任何帮助将不胜感激。
答案 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)
如果代码完全像你的小提琴那么你似乎有一些问题:
我为我的工作做了很多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