2009-10-13 14 views
30

SQL Server XML öğesi belirli bir özniteliği almak için:Bir tablonun bir sütununda aşağıdaki XML böyle bir şey var

<?xml version="1.0" encoding="utf-8"?> 
<container> 
    <param name="paramA" value="valueA" /> 
    <param name="paramB" value="valueB" /> 
    ... 
</container> 

ben TSQL aracılığıyla XML dışına VALUE Milyar kısmını almaya çalışıyorum

Şimdiye kadar doğru düğümü alıyorum, ancak şimdi özniteliği nasıl alacağımı anlayamıyorum.

select xmlCol.query('/container/param[@name="paramB"]') from LogTable 

ben sadece sonuna/@ değer katabilir anlamaya, ama sonra SQL beni nitelikler bir düğümün parçası olmak zorunda söyler. Çocuk düğümleri özniteliklerini seçmek için birçok örnek bulabilirim, ancak kardeş karteşi hakkında hiçbir şey (eğer doğru terimse).

Herhangi bir yardım için teşekkür ederiz.

cevap

51

.query yerine .value işlevini kullanarak deneyin:

SELECT 
    xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM 
    LogTable 

XPath ifadesi potansiyel düğümlerin listesini geri dönebilirler, bu nedenle önce kullanmak SQL Server anlatmak için potansiyel listeye [1] eklemem gerekiyor Bu girişlerin (ve evet - bu liste 1 tabanlı değil - 0 tabanlı). İkinci parametre olarak, değerin ne tür dönüştürüleceğini belirtmeniz gerekir - sadece burada tahmin etmek. senin xml gerçek yapısına bağlı Marc

+1

Teşekkürler. Tam olarak ihtiyacım olan şey. –

+0

Ben endeksine göre okumak mümkün duyuyorum sizin vermek sorgusu kullanarak gibi alanında dinamik düğümleri var. 1 olarak indeks vereceğim zaman, 2 gösterecek ve ben indeks 2 vereceğim, 5 gösterecektir ama her iki düğüm gerektirir. lütfen bana nasıl yapılacağını önerir misiniz? – pixelbyaj

+0

Bunu bir boole için kullanırken sorun yaşıyorum. 'Boolean' ve 'System.Boolean'ı ikinci param olarak kullanmaya çalıştım ve bir hata aldı. Varchar yaparsam, tüm boş değerlerini döndürür. Benim xml satırına benziyor: Zac

5

, 'normal' sql örneğin daha kolay kullanarak tüketmek yapmak üzerine bir görünüm koymak faydalı olabilir

CREATE VIEW vwLogTable 
AS 
SELECT 
    c.p.value('@name', 'varchar(10)') name, 
    c.p.value('@value', 'varchar(10)') value 
FROM 
    LogTable 
    CROSS APPLY x.nodes('/container/param') c(p) 
GO 


-- now you can get all values for paramB as... 
SELECT value FROM vwLogTable WHERE name = 'paramB' 
+0

Neden xmlCol.value ('(/ container/param [@ name = "paramB"]/@ value) [1]', 'varchar (50)') benim için çalışmaz, sadece .value ('@ value' 'vharchar (50)') işe yarıyor mu? Hmmmmm. – AndyClaw

0

$doc/param[@value = "valueB"]/fn:data(@value)
$ doc varsayarsak Xml vardır.

İlgili konular