Partekatu bidez


Control de errores (XQuery)

Se aplica a:SQL Server

La especificación W3C permite emitir errores de tipo de forma estática o dinámica y define errores estáticos, dinámicos y de tipo.

Control de errores y compilación

Los errores de compilación se devuelven de expresiones y XML DML instrucciones Xquery incorrectas sintácticamente incorrectas. En la fase de compilación, se comprueba la corrección del tipo estático de las expresiones XQuery y las instrucciones DML, y se utilizan esquemas XML para detectar inferencias de tipos para XML con tipo. Si una expresión puede generar un error en tiempo de ejecución debido a una infracción de seguridad de tipos, se producen errores de tipo estático. Ejemplos de errores estáticos son la suma de una cadena a un entero y la consulta de datos con tipo en un nodo no existente

Como desviación del estándar W3C, los errores en tiempo de ejecución de XQuery se convierten en secuencias vacías. Estas secuencias pueden propagarse como XML vacío o NULL al resultado de la consulta, en función del contexto de invocación.

Una conversión explícita al tipo correcto permite a los usuarios resolver errores estáticos, aunque los errores de conversión en tiempo de ejecución se transformarán en secuencias vacías.

Nota:

Análisis de errores generados por el analizador XQuery (por ejemplo, errores de sintaxis en el XML al que se hace referencia como parte del método de tipo de datos XML, por ejemplo), anule la transacción activa, independientemente de la configuración XACT_ABORT de la sesión actual.

Errores estáticos

Los errores estáticos se devuelven mediante el mecanismo de error de Transact-SQL. En SQL Server, los errores de tipo XQuery se devuelven estáticamente. Para obtener más información, consulte XQuery y Escritura estática.

Errores dinámicos

En XQuery, la mayoría de los errores dinámicos se asignan a una secuencia vacía ("()"). No obstante, existen dos excepciones: las condiciones de sobrecarga en funciones de agregado de XQuery y los errores de validación de XML-DML. La mayoría de los errores dinámicos se asignan a una secuencia vacía. De lo contrario, la ejecución de consultas que aprovecha los índices XML podría generar errores inesperados. Por lo tanto, para proporcionar una ejecución eficaz sin generar errores inesperados, SQL Server Motor de base de datos asigna errores dinámicos a ().

Con frecuencia, en la situación en la que el error dinámico se produciría dentro de un predicado, no generar el error no cambia la semántica, ya que () se asigna a False. Sin embargo, en algunos casos, devolver () en lugar de un error dinámico podría provocar resultados inesperados. Los ejemplos siguientes lo muestran.

Ejemplo: Uso de la función avg() con una cadena

En el ejemplo siguiente, se llama a la función Avg para calcular el promedio de los tres valores. Uno de estos valores es una cadena. Dado que la instancia XML en este caso no está tipada, todos los datos del mismo son de tipo atómico sin tipo. La función avg() convierte primero estos valores en xs:double antes de calcular el promedio. Sin embargo, el valor , "Hello"no se puede convertir a xs:double y crea un error dinámico. En este caso, en lugar de devolver un error dinámico, la conversión de "Hello" a xs:double provoca una secuencia vacía. La función avg() omite este valor, calcula el promedio de los otros dos valores y devuelve 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(//*)')

Ejemplo: Uso de la función not

Cuando se usa la función Not en un predicado, por ejemplo, /SomeNode[not(Expression)]y la expresión produce un error dinámico, se devolverá una secuencia vacía en lugar de un error. La aplicación de not() a la secuencia vacía devuelve True, en lugar de un error.

Ejemplo: Conversión de una cadena

En el ejemplo siguiente, la cadena literal "NaN" se convierte a xs:string, y después a xs:double. El resultado es un conjunto de filas vacío. Aunque la cadena "NaN" no se puede convertir correctamente a xs:double, esto no se puede determinar hasta el tiempo de ejecución porque la cadena se convierte primero en xs:string.

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

En este ejemplo, sin embargo, se produce un error de tipo estático.

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

Limitaciones de implementación

No se admite la función fn:error( ).