Condividi tramite


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 vengono restituiti da espressioni e XML DML istruzioni Xquery sintatticamente non corrette. 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, Queste sequenze possono essere propagate come XML vuoto 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.

Annotazioni

L'analisi degli errori generati dal parser XQuery ,ad esempio errori di sintassi nel codice XML a cui fa riferimento come parte del metodo del tipo di dati XML, ad esempio, interrompe la transazione attiva, indipendentemente dall'impostazione XACT_ABORT della sessione corrente.

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. La maggior parte degli errori dinamici viene mappata a una sequenza vuota. In caso contrario, l'esecuzione di query che sfrutta i vantaggi degli indici XML potrebbe generare errori imprevisti. Pertanto, per garantire un'esecuzione efficiente senza generare errori imprevisti, SQL Server motore di database esegue il mapping degli errori dinamici a ().

Spesso, nella situazione in cui si verifica l'errore dinamico all'interno di un predicato, la mancata generazione dell'errore non modifica la semantica, perché () è mappata a False. In alcuni casi, tuttavia, la restituzione di () anziché un errore dinamico potrebbe causare risultati imprevisti. come illustrato negli esempi seguenti.

Esempio: Uso 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 in esso contenuti 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: uso 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: 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 non può essere determinato fino al runtime perché la stringa viene prima di tutto eseguita il cast in 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.