2009-12-11 12 views
20

İşte benim sorunum: bir sütunda bulunan aşağıdaki XML'den, 'Etkin' ismiyle bir değişkenin değerinin bir adım kimliği verildiğinde 'Evet'e eşit olup olmadığını bilmek istiyorum ve bir bileşen Id.XPath SQL XML değerini getirme

'<xml> 
    <box stepId="1"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
    <box stepId="2"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
</xml>' 

cevap

31
içinde

Güncelleme

Benim recomendation aramalar ilişkiler içine XML parçalamak ve yapılacak olması ve oldukça XML belirli düğümler arama prosedürel moda yerine, bir dizi yönlendirilmiş şekilde, sonuçlandı ilişkiye katılır olacaktır.

select x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled"]') t(x) 

stepID ise ve: tam olarak ilgilenilen değeri alan bir XPath kullanmak gerekiyorsa,

select x.value(N'../../../../@stepId', N'int') as StepID 
    , x.value(N'../../@id', N'int') as ComponentID 
    , x.value(N'@nom',N'nvarchar(100)') as Nom 
    , x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x) 

Ancak: Burada düğümleri ve ilgi özelliklerini dışarı imha eder basit bir XML sorgu bileşen kimliği sütunlar, değişken değil, sql: column() yerine sql: variable XPath filtrelerinde kullanmalısınız. Bakınız Binding Relational Data Inside XML Data.

Ve sonda gelen tek ihtiyacınız Eğer exist() XML yöntemini kullanabilirsiniz özendirdiği denetlemek için ise: SQL Server 2005'te XML özelliklerini nasıl kullanacağınızı bilmek

select @x.exist(
    N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled" and @valeur="Yes"]') 
+4

'@ x' nedir? * (15 karaktere yorum yapma) * –

+3

O XML'i kullanarak test etmek için SQL Server sorgu penceresindeki ifadelerinin üzerinde 'DECLARE @ x ​​XML = (sorgudan xml); olduğundan şüpheleniyorum ama Cevap çünkü gereksiz olurdu. Tüm söyleyeyim ki bu sorunun XML'ini içeren bir değişken olduğundan şüpheliyim. – sirdank

2

Hep bu makalede SQL Server 2005 XQuery and XML-DML - Part 1 geri dönmek

Temel XPath teknik bilgisi için, W3Schools tutorial'u öneririm.

/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"] 

Bu, belirtilen $ stepId ve $ Componentıd adını "Evet" değerine sahip "Etkin" değişkenleri almalısınız:

2

İstediğin xpath sorgusu bu şekilde olduğunu düşünüyorum . Bu göstermek gibi xml bir etiketi ile başlar varsayarak, ve SQL Server 2005 XPath şeyler (ben bunu hiç kullanmadım) oldukça basit değilse

ardından yukarıdaki sorgu çalışmalıdır. Aksi halde, başka bir kişinin size yardımcı olması gerekebilir.

+0

Teşekkürler, bu yardımcı oldu. Bir eşleşme bulunursa veya bulunmazsa doğru veya yanlış nasıl döndürebilirim? Ya da 0 veya 1 döndür. – joerage

+0

Emin değilim.Böyle bir şey deneyebilirsiniz: sayımı ()> = 1 SEÇ 0 –

+0

BAŞKA SEÇ EĞER sen yoksun yöntemi kullanabilirsiniz. Field.EXIST ('xpath') –