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)