Funzioni per estensioni XQuery - sql:column()
Si applica a: SQL Server
Come descritto nell'argomento Binding Relational Data Inside XML, è possibile usare la funzione sql:column(() quando si usano metodi di tipo di dati XML per esporre un valore relazionale all'interno di XQuery.
Ad esempio, il metodo query() (tipo di dati XML) viene usato per specificare una query su un'istanza XML archiviata in una variabile o in 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, usare 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 specificata nella funzione sql:column() all'interno di una query XQuery fa riferimento a una colonna nella riga in fase di elaborazione.
In SQL Server è possibile fare riferimento a un'istanza xml solo nel contesto dell'espressione di origine di un'istruzione di inserimento XML-DML. In caso contrario, non è possibile fare riferimento a colonne di tipo xml o clr definite dall'utente.
La funzione sql:column() non è supportata nelle operazioni JOIN. Al suo posto, è possibile utilizzare l'operazione APPLY.
Esempi
R. 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 dell'attributo ProductID, ProductName e ProductPrice vengono ottenuti dalla tabella Product.
Il valore dell'attributo ProductModelID viene recuperato dalla tabella ProductModel.
Per rendere la query più interessante, 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", usato 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 usata per inserire valori non XML all'interno di 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. Il codice XML viene quindi assegnato alla @x variabile 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
Vedi anche
Funzioni di estensione XQuery di SQL Server
Confrontare dati XML tipizzati con dati XML non tipizzati
Dati XML (SQL Server)
Creare istanze di dati XML
metodi con tipo di dati xml
Linguaggio XML di manipolazione dei dati (XML DML)