2012-12-16 16 views
6

SQL Server 2008 kullanıyorum ve XML öğelerini almak ve öğenin kendisini ve özelliklerini alt öğeler olmadan ve text() olmadan döndürmek istiyorum. Ben istiyorum SQL Server'da alt öğeler olmadan bir öğe alma

<doc> 
<apple type="bramley"> tasty <b>yum!</b> </apple> 
<banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc> 

dönmek için:

<doc/> 
<apple type="bramley"/> 
<b/> 
<banana color="yellow" shape="bendy"/> 

Ör doktor herhangi bir alt düğümler ve olmadan iade edilmelidir Örn aşağıdaki XML 4 düğümleri (doc, elma, b, muz) sahiptir apple alt node değeri b olmadan iade edilmelidir. Ancak sorun, SQL Server düğümlerini ve sorgu yöntemini kullanırsam alt düğümleri kaldıramıyorum. SQL Server kullanarak 2008 Ben yakın:

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); 

Bu (yerel-adını kullanarak) her düğüm adını alır ve düğümün nitelikleri ve iadeler:

Node Attr 
---- ---- 
doc  <xx /> 
apple <xx type="bramley" /> 
b  <xx /> 
banana <xx color="yellow" shape="bendy" /> 

Elimden fark Bu sonucu işlemek, Attr'ı varchar'a dönüştür, Node sütunu ile xx değiştir ve XML'e geri dön. Ama dize manipülasyon olmadan daha kolay bir yolu var mı?

Not: Eğer yardımı olacaksa çözüm SQL Server 2008 veya SQL Server kullanıyorsa, ben umursamıyorum Genellikle dinamik etiket adlarıyla eleman yapısıyla kullanırsınız, ancak SQL Server bu desteklemediği 2012.

cevap

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); 

bir gibi XQuery Güncelleme alternatif (SQL Server 2012 ile test), biz (tüm içeriği ile) tüm düğümlerin alıp silebilir onların 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

Teşekkürler! Bunu daha sonra bugün deneyeceğim – Ubercoder

+0

Tamam SQL Server'da denedim ama bunu sevmiyor - hata _Only sabit ifadeler hesaplanmış elemanın isminin ifadesi ve constructors_ için destekleniyor. Bu yüzden, yerel sunucu ($ e) ** SQL sunucusunda bir eleman kurucusu olarak izin verilmediğini düşünüyorum (bu, eleman yapıcısını SQL Server'da çok kullanışlı değil ama başka bir hikaye). XQuery'nin test edebileceğim başka varyantları var mı? – Ubercoder

+0

Gerçek bir problem gibi görünüyor. XML oluşturmak için dize birleştirme kullanan başka bir sorunun cevabı var (http://stackoverflow.com/a/4418821/695343) - gerçekten çok çirkin görünüyor. “Eğer bu yaklaşım rahatsız edici ise, şimdi okuyamazsınız :)” ... Probleminizi daha yüksek bir görüş seviyesinden daha iyi görmelisiniz; Çözmeye çalıştığın asıl sorunun nedir? –

İlgili konular