Share via


sql:variable()-Funktion (XQuery)

Macht eine Variable verfügbar, die einen relationalen SQL-Wert in einem XQuery-Ausdruck enthält.

Syntax

sql:variable("variableName") as xdt:anyAtomicType?

Hinweise

Wie im Thema Einbinden relationaler Daten in XML-Daten beschrieben wird, können Sie diese Funktion verwenden, wenn Sie mithilfe von XML-Datentypmethoden einen relationalen Wert innerhalb von XQuery verfügbar machen.

Die query()-Methode 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 sollen in einer Abfrage auch Werte aus einer Transact-SQL-Variablen oder einem -Parameter verwendet werden, um relationale und XML-Daten zu verbinden. Zu diesem Zweck können Sie die sql:variable-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.

Sie können auf eine xml-Instanz nur im Kontext des Quellenausdrucks einer XML DML-Insert-Anweisung verweisen. Andernfalls können Sie nicht auf Werte vom Typ xml oder eines CLR-benutzerdefinierten Typs (Common Language Runtime) verweisen.

Beispiele:

A. Verwenden der sql:variable()-Funktion, um einen Transact-SQL-Variablenwert in XML zu verwenden

Im folgenden Beispiel wird eine XML-Instanz erstellt, die aus Folgendem besteht:

  • Einem Wert (ProductID) aus einer Nicht-XML-Spalte. Zum Binden dieses Werts im XML-Code wird die sql:column()-Funktion verwendet.

  • Einem Wert (ListPrice) aus einer Nicht-XML-Spalte aus einer anderen Tabelle. Die sql:column()-Funktion wird auch hier zum Binden dieses Werts im XML-Code verwendet.

  • Einem Wert (DiscountPrice) aus einer Transact-SQL-Variablen. Zum Binden dieses Werts im XML-Code wird die sql:variable()-Methode verwendet.

  • Einem Wert (ProductModelName) aus einer Spalte vom Typ xml, um die Abfrage interessanter zu gestalten.

Im Folgenden wird die Abfrage aufgeführt:

DECLARE @price money

SET @price=2500.00
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

       <Product 
           ProductID="{ sql:column("Production.Product.ProductID") }"
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"
           ListPrice="{ sql:column("Production.Product.ListPrice") }"
           DiscountPrice="{ sql:variable("@price") }"
        />') 
FROM Production.Product 
JOIN Production.ProductModel
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID
WHERE ProductID=771

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Der XML-Code wird durch die XQuery-Abfrage in der query()-Methode erstellt.

  • Das namespace-Schlüsselwort wird zum Definieren eines Namespacepräfixes im XQuery-Prolog verwendet. Dies geschieht, weil der ProductModelName-Attributwert aus der Spalte des CatalogDescription xml-Typs abgerufen wird, der ein Schema zugeordnet ist.

Dies ist das Ergebnis:

<Product ProductID="771" ProductModelID="19" 
         ProductModelName="Mountain 100" 
         ListPrice="3399.99" DiscountPrice="2500" />