Share via


Metodo value() (tipo di dati xml)

Si applica a:SQL ServerAzure SQL DatabaseIstanza gestita di SQL di Azure

Esegue una query XQuery su XML e restituisce un valore di tipo SQL. rappresentato da un valore scalare.

Questo metodo viene in genere usato per estrarre un valore da un'istanza XML archiviata in una colonna, un parametro o una variabile di tipo xml. In questo modo, è possibile specificare SELECT query che combinano o confrontano dati XML con dati in colonne non XML.

Sintassi

value ( XQuery , SQLType )

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

XQuery

Espressione XQuery , valore letterale stringa, che recupera i dati all'interno dell'istanza XML. Deve restituire almeno un valore, In caso contrario, viene restituito un errore.

SQLType

Tipo SQL preferito, valore letterale stringa, da restituire. Il tipo restituito dal metodo corrisponde al parametro SQLType. SQLType può essere un tipo di dati SQL definito dall'utente.

Nota

SQLType non può essere uno dei tipi di dati seguenti: xml, image, text, ntext, sql_variant o un tipo CLR (Common Language Runtime) definito dall'utente.

Il value() metodo usa l'operatore Transact-SQL CONVERT in modo implicito. value() tenta di convertire il risultato dell'espressione XQuery, la rappresentazione di stringa serializzata, dal tipo XSD (XML Schema Definition) al tipo SQL corrispondente specificato dalla conversione Transact-SQL. Per altre informazioni sulle regole di cast dei tipi per CONVERT, vedere CAST e CONVERT.

Per motivi di prestazioni, è possibile usare exist() con sql:column() anziché usare il value() metodo in un predicato per confrontare con un valore relazionale. Questo exist() esempio viene illustrato più avanti in questo articolo.

Esempi

Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.

R. Utilizzare il metodo value() su una variabile di tipo XML

Nell'esempio seguente un'istanza XML viene archiviata in una variabile di tipo xml . Il metodo value() recupera il valore dell'attributo ProductID dal codice XML Il valore viene quindi assegnato a una variabile int .

DECLARE @myDoc XML;
DECLARE @ProdID INT;

SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>';

SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int');
SELECT @ProdID;

Di conseguenza, viene restituito un valore di 1 .

Anche se nell'istanza XML è presente un ProductID solo attributo, le regole di digitazione statiche richiedono di specificare in modo esplicito che l'espressione di percorso restituisce un singleton. [1] Viene quindi aggiunto alla fine dell'espressione di percorso. Per altre informazioni sulla tipizzazione statica, vedere XQuery e tipizzazione statica.

B. Utilizzare il metodo value() per recuperare un valore intero da una colonna di tipo XML

La query seguente viene eseguita su una colonna di tipo xml (CatalogDescription) nel database AdventureWorks2022. La query recupera i valori dell'attributo ProductModelID da ognuna delle istanze XML archiviate nella colonna.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;

Si noti la query precedente:

  • Viene utilizzata la parola chiave namespace per definire un prefisso dello spazio dei nomi.

  • In base ai requisiti per la tipizzazione statica, nel metodo [1] viene aggiunto value() alla fine dell'espressione di percorso, allo scopo di indicare in modo esplicito che l'espressione restituisce un singleton.

Questo è il set di risultati.

35
34
28
25
23
19

C. Utilizzare il metodo value() per recuperare un valore stringa da una colonna di tipo XML

La query seguente viene specificata sulla colonna di tipo xml (CatalogDescription) nel AdventureWorks2022 database. La query recupera i valori dell'attributo ProductModelName da ognuna delle istanze XML archiviate nella colonna.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
       (/PD:ProductDescription/@ProductModelName)[1]', 'varchar(50)') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;

Si noti la query precedente:

  • Viene utilizzata la parola chiave namespace per definire un prefisso dello spazio dei nomi.

  • In base ai requisiti per la tipizzazione statica, nel metodo [1] viene aggiunto value() alla fine dell'espressione di percorso, allo scopo di indicare in modo esplicito che l'espressione restituisce un singleton.

Questo è il set di risultati.

Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100

D. Utilizzare i metodi value() ed exist() per recuperare i valori da una colonna di tipo XML

Nell'esempio seguente viene illustrato l'uso del metodo value() e del metodo exist() del tipo di dati xml. Il metodo value() consente di recuperare i valori dell'attributo ProductModelID dal codice XML. Il metodo exist() nella clausola WHERE consente di filtrare le righe della tabella.

La query recupera dalle istanze XML gli ID dei modelli del prodotto che includono tra le funzionalità informazioni relative alla garanzia (elemento <Warranty>). La condizione della clausola WHERE utilizza il metodo exist() per recuperare solo le righe che soddisfano tale condizione.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty') = 1;

Si noti la query precedente:

  • La colonna CatalogDescription è una colonna XML tipizzata, ovvero a tale colonna è associato una raccolta di schemi. In Modules and Prologs - XQuery Prolog la dichiarazione dello spazio dei nomi viene usata per definire il prefisso usato più avanti nel corpo della query.

  • Se il exist() metodo restituisce 1 (true), indica che l'istanza XML include l'elemento <Warranty> figlio come una delle funzionalità.

  • Il metodo value() della clausola SELECT recupera quindi i valori dell'attributo ProductModelID come valori interi.

Ecco il risultato parziale:

19
23
...

E. Usare il metodo exist() anziché il metodo value()

Per motivi relativi alle prestazioni, anziché utilizzare il metodo value() in un predicato per eseguire il confronto con un valore relazionale, è consigliabile utilizzare exist() con sql:column(). Ad esempio:

CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO

SELECT c1, c2, c3
FROM T
WHERE c3.value('(/root/@a)[1]', 'integer') = c1;
GO

Questo codice può essere riscritto come segue:

SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO