Funzione sql:column() (XQuery)

Come viene illustrato 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 in XQuery.

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 specificata nella funzione sql:column() all'interno di una query XQuery riguarda una colonna nella riga da elaborare.

In SQL Server è 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 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