Metodo exist() (tipo di dati xml)
Si applica a: SQL Server
database SQL di Azure Istanza gestita di SQL di Azure
Restituisce un bit che rappresenta una delle condizioni seguenti:
1, che rappresenta True, se l'espressione XQuery di una query restituisce un risultato non vuoto, ovvero se restituisce almeno un nodo XML.
0, che rappresenta False, se restituisce un risultato vuoto.
NULL se l'istanza del tipo di dati xml sulla quale è stata eseguita la query contiene NULL.
Sintassi
exist (XQuery)
Nota
Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.
Argomenti
XQuery
È un'espressione XQuery, un valore letterale stringa.
Osservazioni:
Nota
Il metodo exist() restituisce 1 per l'espressione XQuery che restituisce un risultato non vuoto. Se si specifica la funzione true() o false() nel metodo exist(), il metodo exist() restituisce 1, in quanto le funzioni true() e false() restituiscono, rispettivamente, i valori booleani True e False, ovvero un risultato non vuoto. Il metodo exist() restituisce pertanto 1 (True), come illustrato nell'esempio seguente:
DECLARE @x XML;
SET @x='';
SELECT @x.exist('true()');
Esempi
Negli esempi seguenti viene illustrato come specificare il metodo exist().
Esempio: Specifica del metodo exist() su una variabile di tipo XML
Nell'esempio seguente, @x è una variabile di tipo xml (xml non tipizzato) e @f è una variabile di tipo Integer che archivia il valore restituito dal metodo exist(). Il metodo exist() restituisce (1) se il valore di data archiviato nell'istanza XML è 2002-01-01
.
DECLARE @x XML;
DECLARE @f BIT;
SET @x = '<root Somedate = "2002-01-01Z"/>';
SET @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]');
SELECT @f;
Nel confronto delle date nel metodo exist() si noti quanto segue:
Il codice
cast as xs:date?
viene usato per il cast del valore al tipo xs:date ai fini del confronto.Il valore dell'attributo @Somedate non è tipizzato. Nell'operazione di confronto, viene eseguito il cast implicito del valore al tipo sul lato destro del confronto, il tipo xs:date.
Anziché cast as xs:date() è possibile usare la funzione costruttore xs:date(). Per altre informazioni, vedere Funzioni costruttore (XQuery).
L'esempio seguente è simile al precedente, ma contiene un elemento <Somedate
>.
DECLARE @x XML;
DECLARE @f BIT;
SET @x = '<Somedate>2002-01-01Z</Somedate>';
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')
SELECT @f;
Dalla query precedente si noti quanto segue:
- Il metodo text() restituisce un nodo di testo che contiene il valore non tipizzato
2002-01-01
. Il tipo XQuery è xdt:untypedAtomic. È necessario eseguire il cast esplicito di questo valore tipizzato da x a xsd:date, perché il cast implicito non è supportato in questo caso.
Esempio: Specifica del metodo exist() su una variabile XML tipizzata
Nell'esempio seguente viene illustrato l'uso del metodo exist() su una variabile di tipo xml. Si tratta di una variabile XML tipizzata, poiché specifica il nome della raccolta di spazi dei nomi dello schema, ManuInstructionsSchemaCollection
.
Nell'esempio, un documento di istruzioni di produzione viene assegnato a questa variabile, quindi viene usato il metodo exist() per determinare se il documento include un elemento <Location
> in cui il valore dell'attributo LocationID è 50.
Il metodo exist() specificato sulla variabile @x restituisce 1 (True) se il documento di istruzioni di produzione include un elemento <Location
> con LocationID=50
. In caso contrario, il metodo restituisce 0 (False).
DECLARE @x XML (Production.ManuInstructionsSchemaCollection);
SELECT @x=Instructions
FROM Production.ProductModel
WHERE ProductModelID=67;
--SELECT @x
DECLARE @f INT;
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[@LocationID=50]
');
SELECT @f;
Esempio: Specifica del metodo exist() su una colonna di tipo XML
La query seguente recupera gli ID dei modelli di prodotto le cui descrizioni di catalogo non includono le specifiche, ovvero l'elemento <Specifications
>:
SELECT ProductModelID, CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductModelID= "{ sql:column("ProductModelID") }"
/>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/pd:ProductDescription[not(pd:Specifications)]'
) = 1;
Dalla query precedente si noti quanto segue:
La clausola WHERE seleziona solo le righe della tabella ProductDescription che soddisfano la condizione specificata sulla colonna di tipo CatalogDescription xml.
Il metodo exist() della clausola WHERE restituisce 1 (True) se il codice XML non include elementi <
Specifications
>. Si noti l'uso della funzione not() (XQuery).La funzione sql:column() (XQuery) viene usata per recuperare il valore da una colonna non XML.
Questa query restituisce un set di righe vuoto.
La query specifica i metodi query() e exist() del tipo di dati xml ed entrambi i metodi dichiarano gli stessi spazi dei nomi nel prologo della query. In questo caso è possibile utilizzare WITH XMLNAMESPACES per dichiarare il prefisso e utilizzarlo nella query.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
<Product
ProductModelID= "{ sql:column("ProductModelID") }"
/>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
/pd:ProductDescription[not(pd:Specifications)]'
) = 1;
Vedi anche
Aggiungere spazi dei nomi alle query con WITH XMLNAMESPACES
Confrontare dati XML tipizzati con dati XML non tipizzati
Creare istanze di dati XML
metodi con tipo di dati xml
Linguaggio XML di manipolazione dei dati (XML DML)