Metodo value() (tipo di dati xml)
Si applica a: SQL Server Database SQL di Azure Istanza 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 )
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
o AdventureWorksDW2022
, 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 aggiuntovalue()
alla fine dell'espressione di percorso, allo scopo di indicare in modo esplicito che l'espressione restituisce un singleton.
Il set di risultati è il seguente.
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 aggiuntovalue()
alla fine dell'espressione di percorso, allo scopo di indicare in modo esplicito che l'espressione restituisce un singleton.
Il set di risultati è il seguente.
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 restituisce1
(true), indica che l'istanza XML include l'elemento<Warranty>
figlio come una delle funzionalità.Il metodo
value()
della clausolaSELECT
recupera quindi i valori dell'attributoProductModelID
come valori interi.
Di seguito è riportato 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