2012-12-16 67 views
6

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"/> 

は、任意のサブノードなしに返されるべき例えばドキュメントをし、 applebサブノードなしで返されます。しかし、問題は、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年

答えて

1

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 element { local-name($e) } { $e/@* } </xx>') as Attr 
from @x.nodes('//*') as T(c); 

(SQL Server 2012のでテスト済み)XQueryの更新代替として、我々は(すべての内容を含む)すべてのノードを取得し、そのsubnotesを削除することができます。

DECLARE @x xml = '<doc>test 
    <apple type="bramley"> tasty <b>yum!</b> </apple> 
    <banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc>'; 

-- Fetch all nodes 
SET @x = @x.query('//*') 
-- Delete all subnodes 
SET @x.modify('delete /*/node()') 

select 
    c.query('.') as NewNode 
from @x.nodes('/*') as T(c); 
+0

ありがとうございました!私は今日後でそれを試してみます – Ubercoder

+0

OK SQL Serverで試しましたが、それが好きではありません - エラーは_定数だけの式が計算された要素と属性コンストラクタ_の名前式でサポートされています。だから、** local-name($ e)**はSQLサーバの要素コンストラクタとして許可されていないと考えられます(これは要素コンストラクタをSQL Serverではあまり役に立ちませんが、別の話です)。私がテストできるXQueryの他の変種はありますか? – Ubercoder

+0

実際の問題と思われます。 [別の質問への回答があります](http://stackoverflow.com/a/4418821/695343)、XMLを構築するために文字列連結を使用しています - 本当に、本当に醜いようです。 "このアプローチが攻撃的であれば、あなたは今読むのを止めることができます:)" ...より高いレベルの視点からあなたの問題をよく見てください。あなたが解決しようとしている実際の問題は何ですか? –

関連する問題