2012-04-24 10 views
0

私はこのようになりますテーブルのXML列を持つ:xmlフィールドをsqlのテーブルに変換する方法は?

<word A="al" B="h" C="Ps" /> 
<word A="has" B="es" C="Pf" /> 
<word A="mom" B="es" C="Ph" /> 

私はこのような表に変換する必要があります。

word | A | B | C 
==================== 
    al | A1 | B1 | C1 
    has | A2 | B2 | C2 
    mom | A3 | B2 | C3 

私はSQL Serverの機能でやりたいです。

ありがとうございます!

+0

あなたの期待した結果があなたの入力と一致していないようです。 XMLの値をどのように解釈するかについて少し説明できますか? –

+0

@Mikael彼は質問と望みの結果を完全に変えました。私の出力が彼の後ろのものともはや一致しないので、私はすでに1度投票されました。 :-( –

+0

@AaronBertrand - あなたは[この1つ]を持っています(http://stackoverflow.com/questions/10293391/how-to-update-a-xml-field-table-in-sql#comment13245007_10293391) *何も起こっていないことを説明するのに役立ちません。しかし私は最も[投票された回答](http://stackoverflow.com/a/10294146/569436):)のようになります。 –

答えて

2

ここではデータ型に推測し、またあなたがa1変換することを意味するものではありませんでしたことを推測 - >A1など

DECLARE @x TABLE(XMLFIELD XML); 

INSERT @x SELECT '<word A="a1" B="b1" C="c1" />' 
UNION ALL SELECT '<word A="a2" B="b2" C="c2" />' 
UNION ALL SELECT '<word A="a3" B="b2" C="c3" />'; 

-- INSERT INTO dbo.OtherTable 
SELECT 
    A = x.a.value('@A', 'varchar(32)'), 
    B = x.a.value('@B', 'varchar(32)'), 
    C = x.a.value('@C', 'varchar(32)') 
FROM @x AS src 
CROSS APPLY src.XMLFIELD.nodes('word') AS x(a); 

結果:

A  B  C 
------- ------- ------- 
a1  b1  c1 
a2  b2  c2 
a3  b2  c3 

EDITを

あなたは完全に質問を変えてしまったので、私の答えは狂ったように見え、まったく無関係に見えるあなたの質問、もう一度お試しください。もう一度私はここでいくつかの推測をしています。なぜなら、あなたは自分のロジックや要件をうまく記述していないからです。 B列は、新しい値が表示されるたびに増加しますか? C列と同じですか? が連続した行にでない重複がある可能性はありますか?

DECLARE @x TABLE(XMLFIELD XML); 

INSERT @x SELECT '<word A="al" B="h" C="Ps" />' 
UNION ALL SELECT '<word A="has" B="es" C="Pf" />' 
UNION ALL SELECT '<word A="mom" B="es" C="Ph" />'; 

;WITH y AS 
(
    SELECT 
    word = x.a.value('@A', 'varchar(32)'), 
    n = ROW_NUMBER() OVER (ORDER BY x.a.value('@A', 'varchar(32)')), 
    B = x.a.value('@B', 'varchar(32)'), 
    C = x.a.value('@C', 'varchar(32)') 
    FROM @x AS src 
    CROSS APPLY src.XMLFIELD.nodes('word') AS x(a) 
) 
SELECT word, 
    A = 'A' + RTRIM(n), 
    B = 'B' + RTRIM((SELECT COUNT(*)+1 FROM y AS y2 WHERE n < y.n AND B <> y.B)), 
    C = 'C' + RTRIM((SELECT COUNT(*)+1 FROM y AS y2 WHERE n < y.n AND C <> y.C)) 
FROM y 
ORDER BY word; 

結果:あなたは実際に、あなたが努力の束である前に、よくあなたの問題を説明する(そして右の初めてそれを得る上で動作するはずですあなたの問題を解決するコヒーレント答えをしたい場合は

word A B C 
------ ---- ---- ---- 
al  A1 B1 C1 
has A2 B2 C2 
mom A3 B2 C3 

間違った問題の解決に費やした)。

+0

A1いいえa1 B1いいえb1 –

+1

本当に?さて、3つの列に 'UPPER()'を適用してください。 'UPPER(xavalue(' @ A '、...' –

+0

)投票者の方は、OPが質問を完全に変更したことに注意してください。私の回答は元の質問に正しく答えました。出力上のケース右。 –

関連する問題