2016-11-08 11 views
0

以下のコードを使用してxmlを生成しようとしています。しかし、私は出力結果に満足していない。以下のコードでは、カーソルを生成して別のテーブルで更新するためのIDを取得するためにカーソルを使用しています。どんな助けもありがとうございます。私はxmlを初めて使っています。おかげフィールドを2回繰り返さずに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> 

あるしかし、私はAS 'field'を離れて聞かせするのに十分で可能性がありますこのよう

<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

に置き換えることができ、次のいずれか私はあなたがこのためにカーソルを必要とするだろうとは思いません。これは、通常のセットベースの操作では簡単に実行する必要があります。必要に応じて、テーブルの定義を減らし、いくつかの行のサンプルデータと期待される出力を追加して、もう1つの質問を追加することができます。 – Shnugo

+0

ありがとうShnugo、それは働いた。もちろん、カーソルなしで生成する別の質問を投稿します。 – wwidhoo

答えて

2

に結果が欲しいです。 FOR XML PATH('field')は、各行を<field>要素でラップします。

XMLを返すサブ選択は、通常の列のように処理されるスカラー値と見ることができます。列エイリアスを提供することにより、このノード全体が名前を取得し、この名前は再びラップされた<field>要素に変換されます。

あなたはこれを消去、またはAS [node()]またはところでAS [*]

+0

私はちょうど同じものを入力しようとしていました( 'AS 'フィールド'をドロップしてください):) –

+0

あなたは質問をフォーマットして忙しかった:-)次回に勝ちました.. – Shnugo

+0

それは私の趣味です; –

関連する問題