Megosztás a következőn keresztül:


XQuery Extension Functions – sql:column()

A következőkre vonatkozik:SQL Server

A témakörben leírtak szerint relációs adatok kötése XML-belül, az sql:column() függvényt akkor használhatja, ha XML-adattípus-metódusokat használva relációs értéket tesz elérhetővé az XQueryben.

A query() metódus (XML-adattípus) például egy olyan XML-példány lekérdezésének megadására szolgál, amely xml- típusú változóban vagy oszlopban van tárolva. Előfordulhat, hogy azt is szeretné, hogy a lekérdezés egy másik, nem XML-oszlop értékeit használja a relációs és XML-adatok összehozásához. Ehhez az sql:column() függvényt kell használnia.

Az SQL-érték megfeleltethető egy megfelelő XQuery-értékhez, és a típusa egy XQuery alaptípus lesz, amely egyenértékű a megfelelő SQL-típussal.

Szintaxis

  
sql:column("columnName")  

Megjegyzések

Vegye figyelembe, hogy a sql:column() függvényben megadott oszlopra való hivatkozás az XQueryben a feldolgozandó sor egyik oszlopára utal.

Az SQL Serverben csak egy xml--példányra hivatkozhat egy XML-DML beszúrási utasítás forráskifejezésének kontextusában; ellenkező esetben nem hivatkozhat xml- vagy felhasználó által definiált CLR típusú oszlopokra.

Az sql:column() függvény nem támogatott a JOIN műveletekben. Ehelyett az APPLY művelet használható.

Példák

Egy. Sql:column() használata a relációs érték XML-ben való lekéréséhez

Az XML létrehozásakor az alábbi példa bemutatja, hogyan kérdezhet le értékeket egy nem XML-relációs oszlopból az XML- és relációs adatok kötéséhez.

A lekérdezés az alábbi formátumú XML-t hozza létre:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Jegyezze fel a következőket a létrehozott XML-ben:

  • A ProductID, ProductNameés ProductPrice attribútumértékek a Termék táblából származnak.

  • A ProductModelID attribútum értéke lekéri a ProductModel táblából.

  • A lekérdezés érdekesebbé tétele érdekében a ProductModelName attribútum értéke a CatalogDescriptionxml típusúoszlopából származik. Mivel az XML-termékmodell katalógusadatai nem az összes termékmodellhez tárolódnak, a if utasítás csak akkor kéri le az értéket, ha létezik.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • Mivel az értékek két különböző táblából származnak, a FROM záradék két táblát határoz meg. A WHERE záradékban szereplő feltétel szűri az eredményt, és csak azokat a termékeket kéri le, amelyek termékmodelljei katalógusleírásokkal rendelkeznek.

  • Az XQuery Prolog névtér kulcsszó határozza meg a lekérdezés törzsében használt XML-névtér-előtagot, a "pd"-t. Vegye figyelembe, hogy a "P" és a "PM" tábla aliasok a lekérdezés FROM záradékában vannak definiálva.

  • Az sql:column() függvény nem XML-értékek XML-ben való elhelyezésére szolgál.

Ez a részleges eredmény:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

Az alábbi lekérdezés termékspecifikus információkat tartalmazó XML-t hoz létre. Ezek az információk tartalmazzák a ProductID azonosítót, a ProductName-t, a ProductPrice-t, és ha elérhető, a ProductModelName-t minden olyan termékhez, amely egy adott termékmodellhez (ProductModelID=19) tartozik. Az XML ezután hozzá lesz rendelve xml típusú @x változóhoz.

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Lásd még:

SQL Server XQuery Extension Functions
Gépelt XML összehasonlítása a nem beírt XML-
XML-adatok (SQL Server)
XML-adatpéldányok létrehozása
xml-adattípus-metódusok
XML-adatmódosítási nyelv (XML DML)