Freigeben über


XQuery-Erweiterungsfunktionen – sql:column()

Gilt für: SQL Server

Wie im Thema beschrieben, können Sie die Sql:column(()-Funktion verwenden, wenn Sie XML-Datentypmethoden verwenden, um einen relationalen Wert in XQuery verfügbar zu machen.

Beispielsweise wird die Query()-Methode (XML-Datentyp) verwendet, um eine Abfrage für eine XML-Instanz anzugeben, die in einer Variablen oder Spalte des XML-Typs gespeichert ist. Manchmal kann es auch wünschenswert sein, dass eine Abfrage Werte aus einer anderen Nicht-XML-Spalte verwendet, um relationale und XML-Daten zu verbinden. Dazu verwenden Sie die Funktion "sql:column() ".

Der SQL-Wert wird einem entsprechenden XQuery-Wert zugeordnet, und sein Datentyp ist ein XQuery-Basistyp, der mit dem entsprechenden SQL-Typ äquivalent ist.

Syntax

  
sql:column("columnName")  

Hinweise

Beachten Sie, dass sich der Verweis auf eine in der sql:column() -Funktion innerhalb einer XQuery-Funktion angegebene Spalte auf eine Spalte in der Zeile bezieht, die verarbeitet wird.

In SQL Server können Sie nur im Kontext des Quellausdrucks einer XML-DML-Insert-Anweisung auf eine XML-Instanz verweisen. Andernfalls können Sie nicht auf Spalten verweisen, die vom Typ XML oder einem benutzerdefinierten CLR-Typ sind.

Die Sql:column()- Funktion wird in JOIN-Vorgängen nicht unterstützt. Stattdessen kann der APPLY-Vorgang verwendet werden.

Beispiele

A. Abrufen des relationalen Werts in XML mit sql:column()

Das folgende Beispiel zeigt beim Erstellen von XML, wie Werte aus einer relationalen Nicht-XML-Spalte abgerufen werden, um XML und relationale Daten zu binden.

Die Abfrage erstellt XML in der folgenden Form:

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

Beachten Sie im erstellten XML Folgendes:

  • Die Attributwerte "ProductID", "ProductName" und "ProductPrice " werden aus der Tabelle "Product " abgerufen.

  • Der ProductModelID-Attributwert wird aus der Tabelle "ProductModel " abgerufen.

  • Um die Abfrage interessanter zu gestalten, wird der ProductModelName-Attributwert aus der CatalogDescription-Spalte des XML-Typs abgerufen. Da die XML-Produktmodell-Kataloginformationen nicht für alle Produktmodelle gespeichert werden, wird die if-Anweisung nur zum Abrufen des Werts verwendet, wenn dieser vorhanden ist.

    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  
    

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Da die Werte aus zwei verschiedenen Tabellen abgerufen werden, gibt die FROM-Klausel zwei Tabellen an. Die Bedingung in der WHERE-Klausel filtert das Ergebnis und ruft nur Produkte ab, deren Produktmodelle über Katalogbeschreibungen verfügen.

  • Das Namespace-Schlüsselwort im XQuery Prolog definiert das XML-Namespacepräfix "pd", das im Abfragetext verwendet wird. Beachten Sie, dass die Tabellenaliasse "P" und "PM" in der FROM-Klausel der Abfrage selbst definiert werden.

  • Die Sql:column() -Funktion wird verwendet, um Nicht-XML-Werte in XML zu verwenden.

Dies ist das Teilergebnis:

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

Die folgende Abfrage erstellt XML, das produktspezifische Informationen enthält. Diese Informationen umfassen die Werte ProductID, ProductName, ProductPrice und, wenn verfügbar, ProductModelName für alle Produkte, die zu einem bestimmten Produktmodell, ProductModelID=19, gehören. Der XML-Code wird dann der @x Variablen des XML-Typs zugewiesen.

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  

Weitere Informationen

SQL Server XQuery-Erweiterungsfunktionen
Vergleichen von typisiertem XML mit nicht typisiertem XML
XML-Daten (SQL Server)
Erstellen von Instanzen der XML-Daten
xml Data Type Methods (xml-Datentypmethoden)
XML DML (Data Modification Language)