Funzione sql:column() (XQuery)
Come descritto nell'argomento relativo all'associazione di dati relazionali all'interno di codice XML, è possibile utilizzare la funzione sql:column(() quando si utilizzano i metodi con tipo di dati XML per esporre un valore relazionale nelle informazioni XML.
Ad esempio, il metodo query() con tipo di dati XML viene utilizzato per specificare una query su un'istanza XML archiviata in una variabile o una colonna di tipo xml. Talvolta, potrebbe inoltre essere necessario che la query utilizzi valori di un'altra colonna non XML per unire i dati relazionali e XML. A tale scopo, è consigliabile utilizzare la funzione sql:column().
Verrà eseguito il mapping tra il valore SQL e un valore XQuery corrispondente e il relativo tipo sarà un tipo di base XQuery equivalente al tipo SQL corrispondente.
Sintassi
sql:column("columnName")
Osservazioni
Si noti che il riferimento a una colonna non XML specificata nella funzione sql:column() all'interno di una query XQuery riguarda una colonna nella riga da elaborare.
In SQL Server 2005, non è possibile fare riferimento a colonne di tipo xml o di tipo CLR definito dall'utente.
La funzione sql:column() non è supportata nelle operazioni JOIN. Al suo posto, è possibile utilizzare l'operazione APPLY.
Esempi
A. Utilizzo della funzione sql:column() per recuperare il valore relazionale nell'istanza XML
Nell'esempio seguente relativo alla costruzione di un'istanza XML viene illustrato il recupero di valori da una colonna relazionale non XML per associare dati XML e relazionali.
La query costruisce un'istanza XML con il formato seguente:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Nell'istanza XML costruita si noti quanto segue:
I valori degli attributi ProductID, ProductName e ProductPrice vengono ottenuti dalla tabella Product.
Il valore dell'attributo ProductModelID viene recuperato dalla tabella ProductModel.
Per rendere più interessante la query, il valore dell'attributo ProductModelName viene ottenuto dalla colonna CatalogDescription di tipo xml. Poiché le informazioni XML del catalogo prodotti non vengono archiviate per tutti i modelli di prodotto, l'istruzione
if
viene utilizzata per recuperare il valore solo se esiste.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
Dalla query precedente si noti quanto segue:
- Poiché i valori vengono recuperati da due tabelle diverse, la clausola FROM specifica due tabelle. La condizione della clausola WHERE filtra il risultato e recupera solo i prodotti con modelli che includono descrizioni del catalogo.
- La parola chiave namespace nel prologo XQuery definisce il prefisso dello spazio dei nomi XML "pd" utilizzato nel corpo della query. Si noti che gli alias di tabella "P" e "PM" vengono definiti nella clausola FROM della query stessa.
- La funzione sql:column() viene utilizzata per includere valori non XML nell'istanza XML.
Risultato parziale:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
La query seguente costruisce un'istanza XML che contiene informazioni specifiche del prodotto, inclusi i valori degli attributi ProductID, ProductName, ProductPrice e, se disponibile, ProductModelName per tutti i prodotti appartenenti al modello di prodotto specifico ProductModelID=19. L'istanza XML viene quindi assegnata alla variabile @x di tipo xml.
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
Vedere anche
Riferimento
Funzioni per le estensioni XQuery di SQL Server
Concetti
Codice XML tipizzato e non tipizzato
Tipo di dati XML
Generazione di istanze XML
Linguaggio XML di manipolazione dei dati (XML DML)