2017-07-19 43 views
1

我想表转换属性:包含列定义和 表格转换成XML使用T-SQL

  • tblLabelAttributes包含值为每个列的

    • tblCustomAttributeSourceSchema

    为了您的方便,我创建这个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被设置为属性Id和"value"应设置在tblLabelAttributes值。

    如果''tblLabelAttributes''中的属性值为null,则该LabelID的XML中应该缺少“属性”记录。

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

  • +0

    你不必从一个到另一个外键?你如何期待与他们联系? – djangojazz

    +0

    您必须将模式表中的col1映射到tblLabelAttributes的col1(可能需要未转义) – Denis

    +0

    是的,您购买的col1上都有多行col1。我认为你需要从'AttributeGUID'或'AttributeId'键到第二个表上的'LabelId'。 – djangojazz

    回答

    1

    那么你好像有几个问题,如果代码完全像你的小提琴:

    1. 数据是旋转的,所以你会做得更好,以untivot它。
    2. 您没有属性的种子编号,因此您需要创建该编号。
    3. 我还没有得到你如何使用第一张表的参考。

    我做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创建有时工作以及你需要为了显示一个子节点的关系和恕我直言,他们工作得很好,通过在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 
    
    +0

    WOW!这是如此接近......你如何将它变成3行(tblLabelAttributes中的每行1行)? – Denis

    +0

    你说得对,这个结构不好,但这是我继承的东西,我无法控制它。 – Denis

    +0

    在CTE中不透明。 – djangojazz

    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> 
    
    +0

    我知道如何做到这一点。该要求专门针对我在查询中提供的XML。生成元素要简单得多... – Denis