XQuery'de Ad Alanlarını İşleme

Şunlar için geçerlidir: SQL Server

Bu konu, sorgularda isim alanlarının işlenmesi için örnekler sunar.

Examples

A. Bir isim alanı ilan etmek

Aşağıdaki sorgu, belirli bir ürün modelinin üretim adımlarını alır.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /AWMI:root/AWMI:Location[1]/AWMI:step  
    ') as x  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Kısmi sonuç şu şekildedir:

<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>  
...  

İsim alanı anahtar kelimesinin yeni bir namespace öneki olan "AWMI:" tanımlamak için kullanıldığını unutmayın. Bu önek, o isim alanının kapsamına giren tüm elemanlar için sorguda kullanılmalıdır.

B. Varsayılan isim alanı ilan etmek

Önceki sorguda yeni bir isim alanı öneki tanımlanmıştı. Bu önek, sorguda amaçlanan XML yapılarını seçmek için kullanılmak zorundaydı. Alternatif olarak, aşağıdaki değiştirilmiş sorguda gösterildiği gibi, varsayılan isim alanı olarak bir isim alanı ilan edebilirsiniz:

SELECT Instructions.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /root/Location[1]/step  
    ') as x  
FROM Production.ProductModel  
where ProductModelID=7  

Sonuç budur

<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>  
...  

Bu örnekte, tanımlanan isim uzayının "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"varsayılan veya boş isim alanını geçersiz kılmak için yapıldığını unutmayın. Bu nedenle, sorgulama için kullanılan yol ifadesinde artık bir namespace önekiniz yoktur. Ayrıca sonuçlarda görünen eleman isimlerinde artık bir namespace önekiniz yok. Ayrıca, varsayılan isim alanı tüm elemanlara uygulanır, ancak özniteliklerine uygulanmaz.

C. XML yapısında isim alanlarının kullanımı

Yeni isim alanları tanımladığınızda, bunlar sadece sorgu için değil, aynı zamanda yapı kapsamına dahil edilir. Örneğin, XML oluştururken, "declare namespace ..." bildirgesini kullanarak yeni bir isim alanı tanımlayabilir ve ardından bu namespace'i sorgu sonuçlarında görünecek şekilde oluşturduğunuz herhangi bir öğe ve öznitelikle birlikte kullanabilirsiniz.

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace myNS="uri:SomeNamespace";<myNS:Result>  
          { /ProductDescription/Summary }  
       </myNS:Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Sonuç şu şekildedir:

  
      <myNS:Result xmlns:myNS="uri:SomeNamespace">  
  <Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
     Our top-of-the-line competition mountain bike. Performance-enhancing   
     options include the innovative HL Frame, super-smooth front   
     suspension, and traction for all terrain.</p1:p>  
  </Summary>  
</myNS:Result>  

Alternatif olarak, XML yapısının bir parçası olarak kullanılan her noktada isim alanını açıkça tanımlayabilirsiniz; aşağıdaki sorguda gösterildiği gibi:

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <myNS:Result xmlns:myNS="uri:SomeNamespace">  
          { /ProductDescription/Summary }  
       </myNS:Result>  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

D. Varsayılan isim alanları kullanılarak yapı

Ayrıca oluşturulmuş XML'de kullanılmak üzere varsayılan bir isim alanı da tanımlayabilirsiniz. Örneğin, aşağıdaki sorgu, yerel olarak adlandırılmış öğeler için varsayılan olarak kullanılacak varsayılan bir ad alanı olan "uri:SomeNamespace"\'yi nasıl belirtebileceğinizi gösterir; örneğin eleman <Result> gibi.

SELECT CatalogDescription.query('  
      declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      declare default element namespace "uri:SomeNamespace";<Result>  
          { /PD:ProductDescription/PD:Summary }  
       </Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Sonuç şu şekildedir:

  
      <Result xmlns="uri:SomeNamespace">  
  <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
         Our top-of-the-line competition mountain bike. Performance-  
         enhancing options include the innovative HL Frame, super-smooth   
         front suspension, and traction for all terrain.</p1:p>  
  </PD:Summary>  
</Result>  

Varsayılan eleman isim alanı veya boş isim alanı geçersiz kılınarak, oluşturulan XML'deki tüm yerel adlandırılmış öğeler daha sonra varsayılan isim alanına bağlanır. Bu nedenle, boş isim uzayından faydalanmak için XML oluşturma esnekliği gerekiyorsa, varsayılan eleman isim alanını geçersiz kılmayın.