Funzione sql:variable() (XQuery)

Espone in un'espressione XQuery una variabile che contiene un valore SQL relazionale.

Sintassi

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

Osservazioni

Come viene illustrato nell'argomento relativo all'associazione di dati relazionali all'interno di codice XML, è possibile utilizzare questa funzione quando si utilizzano i metodi con tipo di dati XML per esporre un valore relazionale in XQuery.

Il metodo query() viene ad esempio utilizzato per specificare una query su un'istanza XML archiviata in una variabile o in una colonna con tipo di dati xml. A volte è necessario creare query in grado di utilizzare anche valori contenuti in un parametro o in una variabile Transact-SQL, per mettere insieme dati relazionali e XML. A tale scopo è possibile utilizzare la funzione sql:variable.

Il valore SQL verrà mappato a un valore XQuery corrispondente e sarà convertito in un tipo XQuery equivalente al tipo SQL.

È possibile fare riferimento solo a un'istanza xml nel contesto dell'espressione di origine di un'istruzione XML DML INSERT; in caso contrario, non è possibile fare riferimento a valori di tipo XML o di tipo CLR (Common Language Runtime) definito dall'utente.

Esempi

A. Utilizzo della funzione sql:variable() per convertire in XML il valore di una variabile Transact-SQL

Nell'esempio seguente viene costruita un'istanza XML costituita da:

  • Un valore (ProductID) ottenuto da una colonna non XML. La funzione sql:column() viene utilizzata per associare tale valore nell'istanza XML.

  • Un valore (ListPrice) ottenuto da una colonna non XML di un'altra tabella. La funzione sql:column() viene utilizzata anche in questo caso per associare tale valore nell'istanza XML.

  • Un valore (DiscountPrice) ottenuto da una variabile Transact-SQL. Il metodo sql:variable() viene utilizzato per associare tale valore nell'istanza XML.

  • Un valore (ProductModelName) ottenuto da una colonna di tipo xml, per rendere più interessante la query.

La query è riportata di seguito:

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

Dalla query precedente si noti quanto segue:

  • Gli elementi XQuery utilizzati nel metodo query() costruiscono l'istanza XML.

  • La parola chiave namespace definisce un prefisso di spazio dei nomi nel prologo XQuery. Tale prefisso viene creato perché il valore dell'attributo ProductModelName viene recuperato dalla colonna di tipo xml CatalogDescription xml, a cui è associato uno schema.

Risultato:

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