Sdílet prostřednictvím


Funkce rozšíření XQuery – sql:column()

platí pro:SQL Server

Jak je popsáno v tématu Vazba relačních dat uvnitř XML, můžete použít funkci sql:column(() při použití metod datových typů XML k zveřejnění relační hodnoty uvnitř XQuery.

Například metoda query() (datový typ XML) slouží k zadání dotazu na instanci XML, která je uložena v proměnné nebo sloupci typu XML . Někdy můžete chtít, aby dotaz používal hodnoty z jiného sloupce, který není XML, k propojení relačních dat a dat XML. K tomu použijete funkci sql:column().

Hodnota SQL se namapuje na odpovídající hodnotu XQuery a jeho typ bude základní typ XQuery, který odpovídá odpovídajícímu typu SQL.

Syntaxe

  
sql:column("columnName")  

Poznámky

Všimněte si, že odkaz na sloupec zadaný ve funkci sql:column() uvnitř XQuery odkazuje na sloupec v řádku, který se zpracovává.

V SQL Serveru můžete odkazovat pouze na instanci XML v kontextu zdrojového výrazu příkazu XML-DML insert; v opačném případě nelze odkazovat na sloupce, které jsou typu XML nebo CLR uživatelem definovaný typ.

Funkce sql:column() není v operacích JOIN podporovaná. Místo toho je možné použít operaci APPLY.

Examples

A. Použití sql:column() k načtení relační hodnoty uvnitř XML

Při vytváření XML ukazuje následující příklad, jak můžete načíst hodnoty z relačního sloupce mimo XML pro vazbu XML a relačních dat.

Dotaz vytvoří XML, který má následující formulář:

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

Všimněte si následující položky v vytvořeném xml:

  • Hodnoty atributů ProductID, ProductName a ProductPrice jsou získány z tabulky Product .

  • Hodnota atributu ProductModelID se načte z tabulky ProductModel .

  • Aby byl dotaz zajímavější, hodnota atributu ProductModelName se získá ze sloupce CatalogDescriptiontypu XML. Protože informace katalogu modelů produktů XML nejsou uloženy pro všechny modely produktu, příkaz se používá k načtení hodnoty pouze v případě, if že existuje.

    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  
    

Všimněte si následujících věcí z předchozího dotazu:

  • Vzhledem k tomu, že hodnoty se načítají ze dvou různých tabulek, klauzule FROM určuje dvě tabulky. Podmínka v klauzuli WHERE vyfiltruje výsledek a načte pouze produkty, jejichž modely produktů mají popisy katalogu.

  • Klíčové slovo oboru názvů v XQuery Prolog definuje předponu oboru názvů XML ,pd", která se používá v textu dotazu. Všimněte si, že aliasy tabulky P a PM jsou definovány v klauzuli FROM samotného dotazu.

  • Funkce sql:column() slouží k přenesení hodnot mimo XML do XML.

Toto je částečný výsledek:

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

Následující dotaz vytvoří XML, který obsahuje informace specifické pro produkt. Tyto informace zahrnují ID produktu, ProductName, ProductPrice a pokud je k dispozici, productModelName pro všechny produkty, které patří do konkrétního modelu produktu, ProductModelID=19. Xml se pak přiřadí proměnné @x typu XML .

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  

Viz také

Porovnání typed XML to Untyped XML
XML Data (SQL Server)
Vytvoření instancí dat XML
Xml – metody datového typu
XML Data Modification Language (XML DML)