Gestione degli errori (XQuery)
La specifica W3C consente la generazione di errori statica oppure dinamica e definisce gli errori statici, dinamici e di tipo.
Compilazione e gestione degli errori
Gli errori di compilazione derivano da espressioni XQuery e istruzioni XML DML con sintassi non corretta. Durante la fase di compilazione viene verificata la correttezza dei tipi statici di espressioni XQuery e istruzioni DML e vengono utilizzati schemi XML per l'inferenza dei tipi per gli XML tipizzati. Viene generato un errore di tipo statico se è possibile che, in fase di esecuzione, un'espressione non riesca a causa di una violazione dell'indipendenza dai tipi. Questo si verifica ad esempio quando una stringa viene sommata a un valore integer oppure si esegue una query per individuare dati tipizzati in un nodo inesistente.
Diversamente da quanto previsto dallo standard W3C, gli errori di run-time di XQuery vengono convertiti in sequenze vuote, che possono essere propagate come valori vuoti XML o NULL al risultato della query, a seconda del contesto di chiamata.
Per evitare gli errori statici è possibile eseguire il cast esplicito al tipo corretto, tuttavia gli errori di cast che si verificano in fase di esecuzione vengono convertiti in sequenze vuote.
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 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: utilizzo della funzione avg () con una stringa
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 xml
SET @x=N'<root xmlns:myNS="test">
<a>100</a>
<b>200</b>
<c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')
Esempio: utilizzo della funzione not
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: esecuzione del cast di una stringa
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 XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
In questo esempio tuttavia, viene generato un errore di tipo statico.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Limitazioni di implementazione
La funzione fn:error() non è supportata.
Vedere anche