XQuery Extension Functions – sql:variable()

Gäller för:SQL Server

Exponerar en variabel som innehåller ett SQL-relationsvärde inuti ett XQuery-uttryck.

Syntax

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

Remarks

Som beskrivs i ämnet Binding Relational Data Inside XML kan du använda denna funktion när du använder XML-datatypmetoder för att exponera ett relationsvärde i XQuery.

Till exempel används query()-metoden för att specificera en fråga mot en XML-instans som lagras i en xml-datatypvariabel eller kolumn. Ibland vill du också att din fråga ska använda värden från en Transact-SQL variabel eller parameter för att sammanföra relations- och XML-data. För att göra detta använder du sql:variable-funktionen .

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

Du kan endast hänvisa till en xml-instans i kontexten av källuttrycket för en XML-DML insert-sats; annars kan du inte referera till värden av typen xml eller en användardefinierad användardefinierad typ av Common Language Runtime (CLR).

Examples

A. Att använda sql:variable()-funktionen för att ta in ett Transact-SQL variabelvärde i XML

Följande exempel konstruerar en XML-instans som består av följande:

  • Ett värde (ProductID) från en icke-XML-kolumn. sql:column()-funktionen används för att binda detta värde i XML:en.

  • Ett värde (ListPrice) från en icke-XML-kolumn från en annan tabell. Återigen sql:column() används för att binda detta värde i XML.

  • Ett värde (DiscountPrice) från en Transact-SQL variabel. Metoden sql:variable() används för att binda detta värde i XML:en.

  • Ett värde (ProductModelName) från en xml-typkolumn , för att göra frågan mer intressant.

Det här är frågan:

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  

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

  • XQuery inuti query() metoden konstruerar XML:en.

  • Nyckelordet namespace används för att definiera ett namnrymdsprefix i XQuery-prologen. Detta görs eftersom ProductModelName attributvärdet hämtas från typkolumnen CatalogDescription xml , som har ett schema kopplat till sig.

Det här är resultatet:

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