Gestione degli errori (XQuery)
Si applica a:SQL Server
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 XML Schema 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 intero 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 tramite il meccanismo di errore Transact-SQL. In SQL Server gli errori di tipo XQuery vengono restituiti in modo statico. Per altre informazioni, vedere XQuery e Tipizzazione statica.
Errori dinamici
In XQuery, nella maggior parte dei casi sugli errori dinamici viene eseguito il mapping 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 sugli errori dinamici viene eseguito il mapping 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 generare errori imprevisti, il 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 eseguito il mapping 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 calcolare la media dei 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 prima il cast di questi valori in xs:double prima di calcolare la media. Tuttavia, il valore , "Hello"
non può essere eseguito il cast in xs:double e crea un errore dinamico. In questo caso, invece di restituire un errore dinamico, il cast di "Hello"
a xs:double causa 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 usa la funzione not in un predicato, ad esempio , /SomeNode[not(Expression)]
e l'espressione genera un errore dinamico, verrà restituita una sequenza vuota anziché un errore. 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.
Vedi anche
Informazioni di riferimento sul linguaggio XQuery (SQL Server)
Nozioni fondamentali su XQuery