2017-07-19 56 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