Crear una consulta de notificación

La funcionalidad de las notificaciones de consulta se basa en los mecanismos de detección de cambios que el Motor de base de datos utiliza para mantener las vistas indizadas. Los requisitos y las restricciones de las instrucciones de una consulta de notificación son similares a los de una vista indizada.

Valores de las opciones de SET

Cuando se ejecuta una instrucción SELECT en una solicitud de notificación, deben establecerse las opciones siguientes para la conexión que envía la solicitud:

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

Nota

Al establecer ANSI_WARNINGS en ON se establece implícitamente ARITHABORT en ON cuando el nivel de compatibilidad de la base de datos está establecido en 90. Si el nivel de compatibilidad de la base de datos está establecido en 80 o en un nivel inferior, la opción ARITHABORT debe establecerse explícitamente en ON.

La instrucción no se debe ejecutar bajo los niveles del aislamiento READ_UNCOMMITTED o SNAPSHOT.

Si estas opciones o el nivel de aislamiento no se establecen correctamente, la notificación se activa justo después de ejecutar la instrucción SELECT. Cuando una notificación está activa, la conexión que ejecuta el comando que hace que se active la notificación también debe tener las opciones de SET establecidas de esta manera. De lo contrario, el comando genera un error de Transact-SQL.

Cuando la instrucción está incluida en un procedimiento almacenado, las opciones ANSI_NULLS y QUOTED_IDENTIFIER deben establecerse al crear el procedimiento almacenado. Para obtener más información, vea SET ANSI_NULLS (Transact-SQL) y SET QUOTED_IDENTIFIER (Transact-SQL).

Notificación de instrucciones

Por lo general, se pueden solicitar notificaciones para cualquier consulta que pueda utilizarse para crear una vista indizada. Se pueden establecer notificaciones para las siguientes instrucciones:

  • SELECT

    Para obtener información sobre las limitaciones y los requisitos específicos de SELECT, vea "Instrucciones SELECT admitidas" a continuación. Para obtener más información acerca de la instrucción SELECT, vea SELECT (Transact-SQL).

  • EXECUTE

    En este caso, SQL Server registra una notificación para el comando ejecutado en lugar de la propia instrucción EXECUTE. El comando debe cumplir los requisitos y las limitaciones de las instrucciones SELECT. Para obtener más información acerca de la instrucción EXECUTE, vea EXECUTE (Transact-SQL).

Cuando un comando que registra una notificación contiene más de una instrucción, el Motor de base de datos crea una notificación para cada instrucción del lote.

Instrucciones SELECT admitidas

Se admiten notificaciones de consultas para las instrucciones SELECT que cumplan los requisitos siguientes:

  • Deben indicarse explícitamente las columnas previstas de la instrucción SELECT y las tablas deben calificarse con nombres de dos partes. Esto significa que todas las tablas a las que se haga referencia en la instrucción deben encontrarse en la misma base de datos.

  • La instrucción no puede utilizar asteriscos (*) ni la sintaxis table_name.* para especificar las columnas.

  • La instrucción no puede utilizar columnas sin nombre o con nombres duplicados.

  • La instrucción debe hacer referencia a una tabla base.

  • La instrucción no debe hacer referencia a las tablas con columnas calculadas.

  • Las columnas previstas en la instrucción SELECT no pueden contener expresiones de agregado, a menos que la instrucción utilice una expresión GROUP BY. Cuando se suministra una expresión GROUP BY, la lista de selección puede contener la función de agregado COUNT_BIG() o SUM(). Sin embargo, SUM() no se puede especificar para una columna que acepte valores NULL. La instrucción no puede especificar HAVING, CUBE o ROLLUP.

  • Una columna prevista de la instrucción SELECT que se utilice como una expresión simple no debe aparecer más de una vez.

  • La instrucción no debe incluir el operador PIVOT o UNPIVOT.

  • La instrucción no debe incluir los operadores UNION, INTERSECT o EXCEPT.

  • La instrucción no debe hacer referencia a una vista.

  • La instrucción no debe contener DISTINCT, COMPUTE o COMPUTE BY, o INTO.

  • La instrucción no debe hacer referencia a variables globales de servidor (@@nombreDeVariable).

  • La instrucción no debe hacer referencia a tablas derivadas, tablas temporales o variables de tabla.

  • La instrucción no debe hacer referencia a tablas o vistas de otras bases de datos o servidores.

  • La instrucción no debe contener subconsultas, combinaciones externas o autocombinaciones.

  • La instrucción no debe hacer referencia a los tipos de objetos grandes text, ntext e image.

  • La instrucción no debe utilizar el predicado de texto completo CONTAINS o FREETEXT.

  • La instrucción no debe utilizar funciones de conjuntos de filas, incluidas OPENROWSET y OPENQUERY.

  • La instrucción no debe utilizar ninguna de las funciones de agregado siguientes: AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR o VARP.

  • La instrucción no debe utilizar ninguna función no determinista, incluidas las funciones de categoría y ventana.

  • La instrucción no debe contener agregados definidos por el usuario.

  • La instrucción no debe hacer referencia a tablas o vistas del sistema, incluidas las vistas de catálogo y las vistas de administración dinámica.

  • La instrucción no debe incluir información de FOR BROWSE.

  • La instrucción no debe hacer referencia a una cola.

  • La instrucción no debe contener instrucciones condicionales que no puedan cambiar y no puedan devolver resultados (por ejemplo, WHERE 1=0).

  • La instrucción no puede especificar la sugerencia de bloqueo READPAST.

  • La instrucción no debe hacer referencia a QUEUE (Service Broker).

  • La instrucción no debe hacer referencia a sinónimos.

  • La instrucción no debe tener comparación o expresión basada en tipos de datos double/real.

  • La instrucción no debe utilizar la expresión TOP.

Lotes y procedimientos almacenados

Cuando se realiza una solicitud de suscripción para un lote o procedimiento almacenado, se realiza una solicitud de suscripción independiente para cada instrucción del lote o procedimiento almacenado.

Las instrucciones EXECUTE no registrarán una notificación, pero pasarán la solicitud de notificación al comando que se ejecuta. Si es un lote, se aplicará el contexto a las instrucciones que se ejecutan y se aplicarán las mismas reglas descritas anteriormente.

Suscripciones duplicadas

El envío de un duplicado de una suscripción activa hace que la suscripción existente se renueve usando el nuevo valor de tiempo de espera especificado. Una suscripción duplicada es una suscripción que cumple las siguientes condiciones:

  • La consulta se envía mediante el mismo usuario en el mismo contexto de base de datos.

  • Se utiliza la misma plantilla, valores de parámetros, Id. de notificación y ubicación de envío.

Esto significa que si se solicita una notificación para consultas idénticas, solo se enviará una notificación. Esto se aplica a una consulta duplicada de un lote o cuando se llama varias veces a una consulta de un procedimiento almacenado.

Vea también

Referencia

Conceptos