Megosztás:


Névterek kezelése az XQueryben

A következőkre vonatkozik:SQL Server

Ez a témakör példákat tartalmaz a névterek lekérdezésekben való kezelésére.

Példák

Egy. Névtér deklarálása

Az alábbi lekérdezés egy adott termékmodell gyártási lépéseit kéri le.

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  

Ez a részleges eredmény:

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

Vegye figyelembe, hogy a névtér kulcsszó egy új névtérelőtag, az "AWMI:" definiálására szolgál. Ezt az előtagot ezután a lekérdezésben kell használni az adott névtér hatókörébe tartozó összes elemhez.

B. Alapértelmezett névtér deklarálása

Az előző lekérdezésben egy új névtérelőtag lett definiálva. Ezt az előtagot ezután a lekérdezésben kellett használni a kívánt XML-struktúrák kiválasztásához. Másik lehetőségként deklarálhat egy névteret alapértelmezett névtérként, ahogyan az a következő módosított lekérdezésben is látható:

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  

Ez az eredmény

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

Ebben a példában vegye figyelembe, hogy a definiált névtér ("https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions") az alapértelmezett vagy üres névtér felülbírálásához készült. Emiatt már nem rendelkezik névtérelőtaggal a lekérdezéshez használt elérésiút-kifejezésben. Az eredményekben megjelenő elemnevekben már nem szerepel névtérelőtag. Emellett az alapértelmezett névtér az összes elemre vonatkozik, de az attribútumaikra nem.

C. Névterek használata XML-konstrukcióban

Új névterek definiálásakor a rendszer nem csak a lekérdezésre, hanem az építésre is hatókörbe kerül. Az XML létrehozásakor például definiálhat egy új névteret a "declare namespace ..." deklarációval, majd használhatja ezt a névteret a lekérdezési eredményekben való megjelenéshez létrehozott elemekkel és attribútumokkal.

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  

Ez az eredmény:

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

Azt is megteheti, hogy explicit módon definiálja a névteret minden olyan ponton, ahol az XML-konstrukció részeként használják, ahogyan az a következő lekérdezésben is látható:

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. Építés alapértelmezett névterek használatával

Megadhat egy alapértelmezett névteret is a létrehozott XML-fájlban való használatra. Az alábbi lekérdezés például azt mutatja be, hogyan adhatja meg az alapértelmezett névteret ,,uri:SomeNamespace"\, amely alapértelmezettként használható a helyileg elnevezett elemekhez, például a <Result> elemhez.

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  

Ez az eredmény:

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

Vegye figyelembe, hogy az alapértelmezett elemnévtér vagy üres névtér felülírásával a létrehozott XML összes helyileg elnevezett eleme később a felülíró alapértelmezett névtérhez lesz kötve. Ezért ha rugalmasságra van szüksége az XML létrehozásához az üres névtér kihasználása érdekében, ne bírálja felül az alapértelmezett elemnévteret.

Lásd még:

Névterek hozzáadása az XMLNAMESPACES
XML-adatok (SQL Server)
XQuery Language Reference (SQL Server)