Freigeben über


sql:column()-Funktion (XQuery)

Wie im Thema Einbinden relationaler Daten in XML-Daten beschrieben, können Sie die sql:column()-Funktion verwenden, wenn Sie xml-Datentypmethoden zum Verfügbarmachen eines relationalen Werts in XQuery verwenden.

Die query()-Methode (XML-Datentyp) wird z. B. zum Angeben einer Abfrage für eine XML-Instanz verwendet, die in einer Variablen oder Spalte des xml-Datentyps 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. Zu diesem Zweck können Sie die sql:column(()-Funktion verwenden.

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 ein Verweis auf eine Spalte, die in der sql:column()-Funktion in einer XQuery angegeben wird, auf eine Spalte in der Zeile verweist, die verarbeitet wird.

In SQL Server können Sie auf eine xml-Instanz nur im Kontext des Quellenausdrucks einer XML DML-Insert-Anweisung verweisen. Andernfalls können Sie nicht auf Spalten vom Typ xml oder eines CLR-benutzerdefinierten Typs verweisen.

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

Beispiele:

A. Verwenden von sql:column() zum Abrufen des relationalen Werts in XML

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 ProductID-, ProductName-und ProductPrice-Attributwerte werden aus der Product-Tabelle abgerufen.

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

  • Um die Abfrage interessanter zu gestalten, wird der ProductModelName-Attributwert aus der CatalogDescription-Spalte des xml-Datentyps 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 zum Einbringen von XML-Werten in XML verwendet.

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. Das XML wird anschließend der @x-Variablen vom Typ xml 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