Dela via


XQuery Extension Functions – sql:column()

Gäller för:SQL Server

Som beskrivs i avsnittet Bind relationsdata inuti XML kan du använda funktionen sql:column(() när du använder XML-datatypsmetoder för att exponera ett relationsvärde i XQuery.

Metoden query() (XML-datatyp) används till exempel för att ange en fråga mot en XML-instans som lagras i en variabel eller kolumn av XML-typ . Ibland kanske du också vill att frågan ska använda värden från en annan, icke-XML-kolumn, för att sammanföra relations- och XML-data. För att göra detta använder du funktionen sql:column().

SQL-värdet mappas till ett motsvarande XQuery-värde och dess typ är en XQuery-bastyp som motsvarar motsvarande SQL-typ.

Syntax

  
sql:column("columnName")  

Anmärkningar

Observera att referensen till en kolumn som anges i funktionen sql:column() i en XQuery refererar till en kolumn i raden som bearbetas.

I SQL Server kan du bara referera till en XML-instans i kontexten för källuttrycket för en XML-DML insert-instruktion; Annars kan du inte referera till kolumner som är av typen XML eller en CLR-användardefinierad typ.

Funktionen sql:column() stöds inte i JOIN-åtgärder. Apply-åtgärden kan användas i stället.

Examples

A. Använda sql:column() för att hämta relationsvärdet i XML

När du skapar XML illustrerar följande exempel hur du kan hämta värden från en relationskolumn som inte är XML för att binda XML- och relationsdata.

Frågan konstruerar XML som har följande formulär:

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

Observera följande i den konstruerade XML:en:

  • Attributvärdena ProductID, ProductName och ProductPrice hämtas från tabellen Produkt .

  • Attributet ProductModelID hämtas från tabellen ProductModel .

  • För att göra frågan mer intressant hämtas attributet ProductModelName från kolumnen CatalogDescription av xml-typ. Eftersom kataloginformationen för XML-produktmodellen inte lagras för alla produktmodeller används -instruktionen if endast för att hämta värdet om det finns.

    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  
    

Observera följande från föregående fråga:

  • Eftersom värdena hämtas från två olika tabeller anger FROM-satsen två tabeller. Villkoret i WHERE-satsen filtrerar resultatet och hämtar endast produkter vars produktmodeller har katalogbeskrivningar.

  • Nyckelordet för namnområdet i XQuery Prolog definierar XML-namnområdesprefixet "pd", som används i frågetexten. Observera att tabellalias, "P" och "PM", definieras i FROM-satsen för själva frågan.

  • Funktionen sql:column() används för att ta in icke-XML-värden i XML.

Detta är det partiella resultatet:

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

Följande fråga konstruerar XML som innehåller produktspecifik information. Den här informationen omfattar ProductID, ProductName, ProductPrice och, om tillgängligt, ProductModelName för alla produkter som tillhör en specifik produktmodell, ProductModelID=19. XML-koden tilldelas sedan till variabeln @x av xml-typ .

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  

Se även

Jämför typerad XML med otypad XML
XML-data (SQL Server)
Skapa instanser av XML-data
xml-datatypsmetoder
XML-datamodifieringsspråk (XML DML)