SQL Server 2008を使用していますが、XML要素を取得して、要素(サブ要素なしでtext()なし)を返したいとします。SQL Serverでサブ要素のない要素を取得する
<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>
私は返すしたい:例えば、次のXMLは、4つのノード(DOC、リンゴ、B、バナナ)は
<doc/>
<apple type="bramley"/>
<b/>
<banana color="yellow" shape="bendy"/>
は、任意のサブノードなしに返されるべき例えばドキュメントをし、 appleはbサブノードなしで返されます。しかし、問題は、SQL Serverノードとクエリメソッドを使用すると、サブノードを削除できないということです。 SQL Server 2008を使用すると、私が持っている最も近いです:
declare @x xml = '<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>';
select
c.query('local-name(.)') as Node,
c.query('for $e in . return <xx> {$e/@*} </xx>') as Attr
from @x.nodes('//*') as T(c);
これは、(ローカル名を使用して)各ノードの名前とノードとリターンの属性を取得します。
Node Attr
---- ----
doc <xx />
apple <xx type="bramley" />
b <xx />
banana <xx color="yellow" shape="bendy" />
私は私ができる実現しますこの結果を処理し、Attrをvarcharに変換し、xxをNode列に置き換えてXMLに戻します。しかし、文字列の操作がないと簡単な方法がありますか?
PS:それは助け場合はソリューションは、SQL Server 2008またはSQL Serverを使用している場合、私は気にしない通常あなたはダイナミックタグ名を持つ要素の建設を使用することになりますが、SQL Serverがこの機能をサポートしていません2012年
ありがとうございました!私は今日後でそれを試してみます – Ubercoder
OK SQL Serverで試しましたが、それが好きではありません - エラーは_定数だけの式が計算された要素と属性コンストラクタ_の名前式でサポートされています。だから、** local-name($ e)**はSQLサーバの要素コンストラクタとして許可されていないと考えられます(これは要素コンストラクタをSQL Serverではあまり役に立ちませんが、別の話です)。私がテストできるXQueryの他の変種はありますか? – Ubercoder
実際の問題と思われます。 [別の質問への回答があります](http://stackoverflow.com/a/4418821/695343)、XMLを構築するために文字列連結を使用しています - 本当に、本当に醜いようです。 "このアプローチが攻撃的であれば、あなたは今読むのを止めることができます:)" ...より高いレベルの視点からあなたの問題をよく見てください。あなたが解決しようとしている実際の問題は何ですか? –