Erstellen einer Abfrage für die Benachrichtigung

Die Abfragebenachrichtigungsfunktion baut auf den Änderungserkennungsmechanismen auf, die Database Engine (Datenbankmodul) zum Verwalten indizierter Sichten verwendet. Die Anforderungen und Einschränkungen für Anweisungen in einer Abfrage für die Benachrichtigung ähneln den Anforderungen und Einschränkungen für indizierte Sichten.

Einstellungen der SET-Optionen

Wenn eine SELECT-Anweisung unter einer Benachrichtigungsanforderung ausgeführt wird, muss die Verbindung, die die Anforderung übermittelt, die Optionen für die Verbindung wie folgt festlegen:

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

HinweisHinweis

Beim Festlegen von ANSI_WARNINGS auf ON wird implizit auch ARITHABORT auf ON festgelegt, wenn der Datenbank-Kompatibilitätsgrad auf 90 gesetzt ist. Wird der Kompatibilitätsgrad der Datenbank auf 80 oder niedriger festgelegt, muss die ARITHABORT-Option explizit auf ON festgelegt werden.

Die Anweisung darf nicht unter READ_UNCOMMITTED- oder SNAPSHOT-Isolationsstufen ausgeführt werden.

Wenn diese Optionen bzw. die Isolationsstufe nicht ordnungsgemäß festgelegt werden, wird die Benachrichtigung sofort nach Ausführung der SELECT-Anweisung ausgelöst. Wenn eine Benachrichtigung aktiv ist, müssen für eine Verbindung, die einen Befehl ausgibt, der das Auslösen einer Benachrichtigung bewirkt, die SET-Optionen ebenfalls wie gezeigt festgelegt werden. Anderenfalls schlägt der Befehl mit einem Transact-SQL-Fehler fehl.

Wenn die Anweisung in einer gespeicherten Prozedur enthalten ist, müssen die Optionen ANSI_NULLS und QUOTED_IDENTIFIER beim Erstellen der gespeicherten Prozedur festgelegt werden. Weitere Informationen finden Sie unter SET ANSI_NULLS (Transact-SQL) und SET QUOTED_IDENTIFIER (Transact-SQL).

Anweisungen für Benachrichtigungen

In der Regel können Sie Benachrichtigungen für beliebige Abfragen anfordern, die zum Erstellen einer indizierten Sicht verwendet werden können. Sie können Benachrichtigungen für die folgenden Anweisungen einrichten:

  • SELECT

    Weitere Informationen zu den Anforderungen und Einschränkungen hinsichtlich SELECT finden Sie weiter unten im Abschnitt zu den unterstützten SELECT-Anweisungen. Weitere Informationen zu der SELECT-Anweisung finden Sie unter SELECT (Transact-SQL).

  • EXECUTE

    In diesem Fall registriert SQL Server eine Benachrichtigung für den ausgeführten Befehl anstatt für die EXECUTE-Anweisung selbst. Der Befehl muss den Anforderungen und Einschränkungen für eine SELECT-Anweisung genügen. Weitere Informationen zu der EXECUTE-Anweisung finden Sie unter EXECUTE (Transact-SQL).

Wenn ein Befehl, der eine Benachrichtigung registriert, mehrere Anweisungen enthält, erstellt Database Engine (Datenbankmodul) eine Benachrichtigung für jede Anweisung im Batch.

Unterstützte SELECT-Anweisungen

Abfragebenachrichtigungen werden für SELECT-Anweisungen unterstützt, die die folgenden Anforderungen erfüllen:

  • Die voraussichtlichen Spalten in der SELECT-Anweisung müssen explizit angegeben werden, und Tabellennamen müssen durch zweiteilige Namen qualifiziert werden. Beachten Sie, dass dies bedeutet, dass alle Tabellen, auf die in der Anweisung verwiesen wird, in der gleichen Datenbank gespeichert sein müssen.

  • Die Anweisung darf weder das Sternchen (*) noch die table_name.*-Syntax zum Angeben von Spalten verwenden.

  • Die Anweisung darf keine unbenannten Spalten oder doppelten Spaltennamen verwenden.

  • Die Anweisung muss auf eine Basistabelle verweisen.

  • Die Anweisung darf nicht auf Tabellen mit berechneten Spalten verweisen.

  • Die voraussichtlichen Spalten in der SELECT-Anweisung dürfen nur dann Aggregatausdrücke enthalten, wenn die Anweisung einen GROUP BY-Ausdruck verwendet. Wenn ein GROUP BY-Ausdruck bereitgestellt wird, darf die Auswahlliste die Aggregatfunktionen COUNT_BIG() oder SUM() enthalten. SUM() darf jedoch nicht für eine Spalte angegeben werden, die NULL zulässt. Die Anweisung darf HAVING, CUBE oder ROLLUP nicht angeben.

  • Eine voraussichtliche Spalte in der SELECT-Anweisung, die als einfacher Ausdruck verwendet wird, darf nicht mehrmals vorhanden sein.

  • Die Anweisung darf nicht die PIVOT- oder UNPIVO-Operatoren enthalten.

  • Die Anweisung darf nicht die UNION-, INTERSECT- oder EXCEPT-Operatoren enthalten.

  • Die Anweisung darf nicht auf eine Sicht verweisen.

  • Die Anweisung darf Folgendes nicht enthalten: DISTINCT, COMPUTE oder COMPUTE BY oder INTO.

  • Die Anweisung darf nicht auf globale Servervariablen (@@variable_name) verweisen.

  • Die Anweisung darf nicht auf abgeleitete Tabellen, temporäre Tabellen oder Tabellenvariablen verweisen.

  • Die Anweisung darf nicht auf Tabellen oder Sichten aus anderen Datenbanken oder Servern verweisen.

  • Die Anweisung darf keine Unterabfragen, äußeren Joins oder Selbstjoins enthalten.

  • Die Anweisung darf nicht auf LOB-Typen (Large Object) verweisen: text, ntext und image.

  • Die Anweisung darf keine CONTAINS- oder FREETEXT-Volltextprädikate verwenden.

  • Die Anweisung darf keine Rowsetfunktionen (einschließlich OPENROWSET und OPENQUERY) verwenden.

  • Die Anweisung darf keine der folgenden Aggregatfunktionen verwenden: AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR oder VARP.

  • Die Anweisung darf keine nicht deterministischen Funktionen einschließlich Rang- und Fensterfunktionen verwenden.

  • Die Anweisung darf keine benutzerdefinierten Aggregate enthalten.

  • Die Anweisung darf nicht auf Systemtabellen oder -sichten, einschließlich Katalogsichten und dynamischer Verwaltungssichten, verweisen.

  • Die Anweisung darf keine FOR BROWSE-Informationen enthalten.

  • Die Anweisung darf nicht auf eine Warteschlange verweisen.

  • Die Anweisung darf keine bedingten Anweisungen enthalten, die sich nicht ändern und keine Ergebnisse zurückgeben können (z. B. WHERE 1=0).

  • Die Anweisung darf nicht den Sperrhinweis READPAST angeben.

  • Die Anweisung darf nicht auf eine Service Broker-QUEUE verweisen.

  • Die Anweisung darf nicht auf Synonyme verweisen.

  • Die Anweisung darf keinen auf dem double- bzw. real-Datentyp basierenden Vergleich oder Ausdruck enthalten.

  • Die Anweisung darf nicht den TOP-Ausdruck verwenden.

Batches und gespeicherte Prozeduren

Wenn eine Abonnementanforderung für einen Batch oder eine gespeicherte Prozedur erfolgt, wird für jede Anweisung, die innerhalb des Batches oder der gespeicherten Prozedur ausgeführt wird, eine separate Abonnementanforderung ausgegeben.

EXECUTE-Anweisungen registrieren keine Benachrichtigung, sondern übergeben die Benachrichtigungsanforderung an den ausgeführten Befehl. Wenn es sich um einen Batch handelt, wird der Kontext auf die ausgeführten Anweisungen angewendet, und es gelten die gleichen Regeln wie oben beschrieben.

Doppelte Abonnements

Wird ein Duplikat eines aktiven Abonnements übermittelt, wird das vorhandene Abonnement mithilfe des neu angegebenen Timeoutwerts erneuert. Ein Duplikatabonnement ist ein Abonnement, das die folgenden Bedingungen erfüllt:

  • Die Abfrage wird von demselben Benutzer unter demselben Datenbankkontext übermittelt.

  • Es werden dieselbe Vorlage, dieselben Parameterwerte, dieselbe Benachrichtigungs-ID und derselbe Übermittlungsort verwendet.

Das bedeutet, dass nur eine einzige Benachrichtigung gesendet wird, wenn für identische Abfragen eine Benachrichtigung angefordert wird. Dies gilt sowohl für Abfragen, die in einem Batch dupliziert werden, als auch für Abfragen in einer gespeicherten Prozedur, die mehrmals aufgerufen werden.