2011-08-11 17 views
6

Aşağıdaki sorgu, belirli bir Düğümün alt düğümünü seçmeye çalışıyor. Çocuk düğümünü kodlamak yerine, bir SPROP'ta parametreler olarak iletebilmem için bir değişkeni nasıl kullanırım?XQUERY - 'value()' işlevindeki sql: variable nasıl kullanılır?

declare @T table(XMLCol xml) 
insert into @T values 
('<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Elem1 type="T1"> 
    <Name type="string" display="First name">John</Name> 
    <TimeZone display="Time zone"> 
     <children> 
     <DisplayName type="string" display="Display name">GMT Standard Time</DisplayName> 
     <HiddenName type="string" display="Hidden name">GMT</HiddenName> 
     </children> 
    </TimeZone> 
    </Elem1> 
</Root>') 

declare @Node varchar(50) 
set @Node = 'TimeZone' 

select N.value('(children/DisplayName)[1]', 'varchar(100)') as Value 
from @T as T 
    cross apply T.XMLCol.nodes('//*[local-name()=sql:variable("@Node")]') as X(N) 

cevap

5
declare @T table(XMLCol xml) 
insert into @T values 
('<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Elem1 type="T1"> 
    <DisplayName type="string" display="Display name">No this</DisplayName> 
    <Name type="string" display="First name">John</Name> 
    <TimeZone display="Time zone"> 
     <children> 
     <DisplayName type="string" display="Display name">GMT Standard Time</DisplayName> 
     <HiddenName type="string" display="Hidden name">GMT</HiddenName> 
     </children> 
    </TimeZone> 
    </Elem1> 
</Root>') 

declare @Node1 varchar(50) 
set @Node1 = 'TimeZone' 

declare @Node2 varchar(50) 
set @Node2 = 'DisplayName' 

select N2.Value.value('.', 'varchar(100)') as Value 
from @T as T 
    cross apply (select T.XMLCol.query('//*[local-name()=sql:variable("@Node1")]')) as N1(Value) 
    cross apply (select N1.Value.query('//*[local-name()=sql:variable("@Node2")]')) as N2(Value) 
+2

Bunu çalıştı. Bu şekilde çalışmıyor gibi görünüyor. –

+0

Tekrar deneyiniz. Telefona yazması çok zor :). –

+0

Ancak, bu çalışır, ancak yine de tüm tümceyi bir değişkenle nasıl değiştirebilirim - '(// TimeZone/children/* [local-name() = sql: variable ("@ NodeX")]) [1]' –

1
declare @Node varchar(50) 
set @Node = 'TimeZone' 
declare @ChildName varchar(50) 
set @ChildName='HiddenName' 

;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org') 
select N.value('.', 'varchar(100)') as Value 
from @T as T 
    cross apply T.XMLCol.nodes('//*[local-name()=sql:variable("@Node")]/children/*[local-name(.)=sql:variable("@ChildName")]') as X(N) 
+0

Düğmeleri '// * [local-name() = sql: variable ("@ Node")' yerine değişkenler kullanarak iletebilir miyiz? Bkz. - http://stackoverflow.com/questions/7038038/xquery-sql-how-to-pass-individual-node-elements-as-variables –