Freigeben über


XQuery-Erweiterungsfunktionen – sql:variable()

Gilt für: SQL Server

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 Binding Relational Data Inside XML beschrieben, können Sie diese Funktion verwenden, wenn Sie XML-Datentypmethoden verwenden, um einen relationalen Wert in XQuery verfügbar zu machen.

Die Query()-Methode wird beispielsweise verwendet, um eine Abfrage für eine XML-Instanz anzugeben, die in einer XML-Datentypvariable oder -spalte gespeichert ist. Manchmal möchten Sie möglicherweise auch, dass Ihre Abfrage Werte aus einer Transact-SQL-Variablen oder einem Parameter verwendet, um relationale und XML-Daten zusammenzuführen. Dazu verwenden Sie die sql:variable-Funktion .

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 nur im Kontext des Quellausdrucks einer XML-DML-Insert-Anweisung auf eine XML-Instanz verweisen. Andernfalls können Sie nicht auf Werte verweisen, die vom Typ "XML " oder einem benutzerdefinierten Typ (Common Language Runtime, CLR) sind.

Beispiele

A. Einfügen einer Transact-SQL-Variablen in XML mit der sql:variable()-Funktion

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

  • Einem Wert (ProductID) aus einer Nicht-XML-Spalte. Die Sql:column()-Funktion wird verwendet, um diesen Wert im XML-Code zu binden.

  • 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.

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

  • Ein Wert (ProductModelName) aus einer XML-Typspalte , 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 verwendet, um ein Namespacepräfix im XQuery Prolog zu definieren. 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" />  

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)