Condividi tramite


Gestione degli errori (XQuery)

La specifica W3C consente la generazione di errori statica oppure dinamica e definisce gli errori statici, dinamici e di tipo.

Errori statici

Gli errori statici vengono restituiti utilizzando il meccanismo di gestione degli errori Transact-SQL. In SQL Server, gli errori di tipo XQuery vengono restituiti in modo statico. Per ulteriori informazioni, vedere XQuery e tipizzazione statica.

Errori dinamici

In XQuery, nella maggior parte dei casi gli errori dinamici vengono mappati a una sequenza vuota ("()"), con due eccezioni: condizioni di overflow nelle funzioni di aggregazione XQuery ed errori di convalida XML DML. Si noti che nella maggior parte dei casi gli errori dinamici vengono mappati a una sequenza vuota ("()"). In caso contrario, l'esecuzione della query che utilizza gli indici XML può generare errori imprevisti. Pertanto, per garantire un'esecuzione efficiente senza la generazione di errori imprevisti, Motore di database di SQL Server 2005 esegue il mapping degli errori dinamici a ().

Nei casi in cui l'errore dinamico verrebbe generato all'interno di un predicato, spesso non generare l'errore non modifica la semantica, poiché () viene mappato a False. In alcuni casi tuttavia, la restituzione di () invece di un errore dinamico può causare risultati imprevisti, come illustrato negli esempi seguenti.

Esempio A

Si consideri la query seguente.

DECLARE @x xmlSET @x='<a>Hello</a>'SELECT @x.query('xs:double(/a[1])')

L'espressione xs:double(/a[1] causa un errore dinamico. La conversione in double della stringa restituita dalla funzione string() in fase di esecuzione genera un errore dinamico. Invece di restituire l'errore, la query restituisce una sequenza vuota.

Esempio B

Nell'esempio seguente viene chiamata la funzione avg per il calcolo della media di tre valori. Uno dei valori è una stringa. Poiché l'istanza XML in questo caso è non tipizzata, tutti i dati al suo interno sono di tipo atomico non tipizzato. La funzione avg() esegue il cast dei valori a xs:double prima di calcolare la media. Non è possibile tuttavia eseguire il cast del valore "Hello" a xs:double e viene generato un errore dinamico. In questo caso, invece di restituire un errore dinamico, il cast di "Hello" a xs:double genera una sequenza vuota. La funzione avg() ignora questo valore, calcola la media degli altri due valori e restituisce 150.

DECLARE @x xmlSET @x=N'<root xmlns:myNS="test"> <a>100</a> <b>200</b> <c>Hello</c></root>'SELECT @x.query('avg(//*)')

Esempio C

Quando si utilizza la funzione not in un predicato, ad esempio, /SomeNode[not(Expression)] e l'espressione genera un errore dinamico, invece di un errore verrà restituita una sequenza vuota. L'applicazione di not() alla sequenza vuota restituisce True, anziché un errore.

Esempio D

Nell'esempio seguente viene eseguito il cast della stringa letterale "NaN" a xs:string, quindi a xs:double. Il risultato è un set di righe vuoto. Anche se non è possibile eseguire correttamente il cast della stringa "NaN" a xs:double, questo fatto non può essere determinato fino al momento dell'esecuzione, perché prima viene eseguito il cast della stringa a xs:string.

DECLARE @x XMLSET @x = ''SELECT @x.query(' xs:double(xs:string("NaN")) ')GO

In questo esempio tuttavia, viene generato un errore di tipo statico.

DECLARE @x XMLSET @x = ''SELECT @x.query(' xs:double("NaN") ')GO

Limitazioni di implementazione

La funzione fn:error() non è supportata.

Vedere anche

Concetti

Nozioni fondamentali su XQuery

Altre risorse

XQuery sul tipo di dati XML

Guida in linea e informazioni

Assistenza su SQL Server 2005