2012-05-23 70 views
1

請檢查以下查詢。XML查詢中的變量用法

 declare @xmlRoot as xml 
     set @xmlRoot= '<Root> 
     <table1 col1="2012-03-02T16:42:55.777"> 
      <table2Array> 
       <Table2 col2="abc"> 
       </Table2> 
       <Table2 col2="def"> 
       </Table2> 
      </table2Array> 
      </table1> 
     <table1 col1="2012-03-02T17:42:55.777"> 
      <table2Array> 
       <Table2 col2="abc1"> 
       </Table2> 
       <Table2 col2="def1"> 
       </Table2> 
      </table2Array> 
      </table1> 
     </Root>' 

     declare @a as varchar(1) 
      set @a= '1' 

     SELECT 
     col1 = item.value('./@col2', 'varchar(10)') 
     FROM @xmlRoot.nodes('Root/table1[1]/table2Array/Table2' ) AS T(item); 

--The上面的查詢返回預期的輸出

SELECT 
col1 = item.value('./@col2', 'varchar(10)') 
FROM @xmlRoot.nodes('Root/table1[*[local-name()=sql:variable("@a")]]/table2Array/Table2' ) 
    AS T(item); 

--The上面的查詢不返回預期的輸出

我究竟做錯了什麼?

因爲我沒有父節點中的鍵值來標識子節點。我必須通過索引來解析。

回答

1

這爲我工作:

DECLARE @a INT; -- data type is probably important! 
SET @a = 1; 

SELECT col1 = item.value('./@col2', 'varchar(10)') 
FROM @xmlRoot.nodes('Root/table1[sql:variable("@a")]/table2Array/Table2') AS T(item); 
+0

非常感謝你。 – Esen