declare @xml xml
set @xml = '<UserIDs><UserID type=''2''>1</UserID><UserID>2</UserID><UserID>3</UserID></UserIDs>'
select @xml.query('//UserID/@type')我想要通过query方式得到Type属性值
为什么提示XQuery [query()]: 属性不能出现在元素外请问这个获取属性值的代码应该怎么写

解决方案 »

  1.   

    得到值应该用 value , 不应该用query
      

  2.   

    declare @xml xml 
    set @xml = ' <UserIDs> <UserID type=''2''>1 </UserID> <UserID>2 </UserID> <UserID>3 </UserID> </UserIDs>' 
    select @xml.value('(//UserID/@type)[1]', 'int') 
      

  3.   

    declare @xml xml 
    set @xml = ' <UserIDs>
                   <UserID type="2">1 </UserID> 
                   <UserID>2 </UserID> 
                   <UserID>3 </UserID> 
                </UserIDs>' SELECT @xml.value('(/UserIDs/UserID/@type)[1]','int')/*
    -----------
    2(1 行受影响)*/
      

  4.   

    如果我想通过query得到值没办法吗?
      

  5.   

    query 不能得到值下面这个查询可以得到 @type 里面的数据, 但它不是以值的形式返回, 它返回的还是 xml 实例
    declare @xml xml 
    set @xml = ' <UserIDs> <UserID type=''2''>1 </UserID> <UserID>2 </UserID> <UserID>3 </UserID> </UserIDs>' 
    select @xml.query('for $i in //UserID/@type return(string($i))')
      

  6.   


    declare @xml xml 
    set @xml = ' <UserIDs>
                   <UserID type="2">1 </UserID> 
                   <UserID>2 </UserID> 
                   <UserID>3 </UserID> 
                </UserIDs>' SELECT @xml.query('for $i in /UserIDs/UserID[@type]
                          return string($i/@type)')
      

  7.   


    DECLARE   @idoc   int   
      DECLARE   @doc   varchar(1000)   
      SET   @doc   ='   
      <ROOT>   
      <Customer   CustomerID="VINET"   ContactName="Paul   Henriot">   
            <Order   OrderID="10248"   CustomerID="VINET"   EmployeeID="5"     
                          OrderDate="1996-07-04T00:00:00">   
                  <OrderDetail   ProductID="11"   Quantity="12"/>   
                  <OrderDetail   ProductID="42"   Quantity="10"/>   
            </Order>   
      </Customer>   
      <Customer   CustomerID="LILAS"   ContactName="Carlos   Gonzlez">   
            <Order   OrderID="10283"   CustomerID="LILAS"   EmployeeID="3"     
                          OrderDate="1996-08-16T00:00:00">   
                  <OrderDetail   ProductID="72"   Quantity="3"/>   
            </Order>   
      </Customer>   
      </ROOT>'   
      --   Create   an   internal   representation   of   the   XML   document.   
      EXEC   sp_xml_preparedocument   @idoc   OUTPUT,   @doc   
      --   Execute   a   SELECT   statement   using   OPENXML   rowset   provider.   
      SELECT   *   
      FROM   OPENXML   (@idoc,   '/ROOT/Customer',1)   
                  WITH   (CustomerID     varchar(10),   
                              ContactName   varchar(20))   
      EXEC   sp_xml_removedocument   @idoc