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.
Compilación y control de errores
Las expresiones XQuery e instrucciones XML DML sintácticamente incorrectas generan errores de compilación. 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 se pueden propagar al resultado de la consulta como XML vacío o NULL, dependiendo 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.
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, vea 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. Tenga en cuenta que la mayoría de los errores dinámicos se asignan a una secuencia vacía. De lo contrario, la ejecución de consultas que se aprovecha de los índices XML puede producir 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 ().
A menudo, en una situación en la que el error dinámico se produciría dentro de un predicado, no emitir el error es no cambiar la semántica, porque () se asigna a False. Sin embargo, en algunos casos, devolver () en lugar de un error dinámico puede dar lugar a resultados inesperados. Los ejemplos siguientes lo muestran.
Ejemplo: utilizar 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. Puesto que la instancia XML en este caso no tiene tipo, todos los datos que contiene 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: utilizar la función not
Cuando se usa la función not en un predicado, por ejemplo, /SomeNode[not(Expression)]
, y la expresión provoca 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: convertir 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 a 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 la implementación
No se admite la función fn:error().
Consulte también
Referencia del lenguaje XQuery (SQL Server)
Conceptos básicos de XQuery