Hantera namnområden i XQuery

Gäller för:SQL Server

Detta ämne ger exempel för hantering av namnrymder i frågor.

Examples

A. Deklarering av ett namnrymd

Följande fråga hämtar tillverkningsstegen för en specifik produktmodell.

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  

Detta är det partiella resultatet:

<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>  
...  

Observera att namnrymdsnyckelordet används för att definiera ett nytt namnrymdsprefix, "AWMI:". Detta prefix måste sedan användas i frågan för alla element som faller inom namnrymdens omfattning.

B. Deklarering av ett standardnamnrymd

I den föregående frågan definierades ett nytt namnrymdsprefix. Det prefixet måste sedan användas i frågan för att välja de avsedda XML-strukturerna. Alternativt kan du deklarera ett namnrymd som standardnamnrymd, som visas i följande modifierade fråga:

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  

Det här är resultatet

<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>  
...  

Observera i detta exempel att det definierade namnrymden, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions", görs för att åsidosätta standardnamnrymden eller tomma namnrymden. På grund av detta har du inte längre något namnrymdsprefix i sökvägsuttrycket som används för att fråga. Du har inte heller längre något namnrymdsprefix i elementnamnen som visas i resultaten. Dessutom tillämpas standardnamnrymden på alla element, men inte på deras attribut.

C. Användning av namnrymder i XML-konstruktion

När du definierar nya namnrymder tas de in i omfattning inte bara för frågan, utan även för konstruktionen. Till exempel, när du konstruerar XML kan du definiera ett nytt namnrymd genom att använda "declare namespace ...""-deklarationen och sedan använda det namnrymden med alla element och attribut du konstruerar för att visas i frågeresultaten.

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  

Det här är resultatet:

  
      <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>  

Alternativt kan du också definiera namnrymden explicit vid varje punkt där den används som en del av XML-konstruktionen, som visas i följande fråga:

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. Konstruktion med standardnamnrymder

Du kan också definiera ett standardnamnrymd för användning i konstruerad XML. Till exempel visar följande fråga hur du kan specificera ett standardnamnrymd, "uri:SomeNamespace"\, som ska användas som standard för de lokalt namngivna elementen som konstrueras, såsom elementet <Result> .

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  

Det här är resultatet:

  
      <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>  

Observera att genom att överskriva standardelementnamnrymden eller tomma namnrymden binds alla lokalt namngivna element i den konstruerade XML:n därefter till den överskrivande standardnamnrymden. Därför, om du behöver flexibilitet i att konstruera XML för att dra nytta av det tomma namnrymden, åsidosätt inte standardelementnamnrymden.