2016-11-08 55 views
0

我試圖使用下面的代碼生成一個XML。但是我對輸出結果不滿意。在下面的代碼中,我使用遊標來獲取要生成的xml的id並在另一個表中進行更新。任何幫助表示讚賞,我是新來的XML。由於我如何生成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> 
+1

順便說一句改爲:我不認爲你需要爲這個光標。這應該很容易在正常的基於集合的操作中完成。如果你願意的話,你可能會增加一個問題,你提供一個簡化的表格定義以及一些樣品數據行和預期的輸出。 – Shnugo

+0

謝謝Shnugo,它工作。當然,會發布另一個問題來生成它沒有光標。 – wwidhoo

回答

2

可能足以讓AS 'field'路程。您的FOR XML PATH('field')將包含每行<field>元素。

XML返回的子選擇可以看作標量值,像普通列一樣處理。通過提供一個列別名,整個節點獲得一個名稱,並且這個名稱再次被轉換爲一個包裝<field>元素。

您可以刪除這一點,或者AS [node()]AS [*]

+0

我只是想輸入一樣的東西(放下'AS'字段':)) –

+0

你忙於格式化問題:-)下次你贏了.. – Shnugo

+0

是的,這是我的愛好;) –

相關問題