Creazione di una query da notificare

La funzionalità di notifica delle query è basata sui meccanismi di rilevamento delle modifiche utilizzati da Motore di database per gestire le viste indicizzate. Le restrizioni e i requisiti validi per le istruzioni di una query da notificare sono simili a quelli per una vista indicizzata.

Impostazioni dell'opzione SET

Se in una richiesta di notifica viene eseguita un'istruzione SELECT, è necessario impostare le opzioni della connessione che invia la richiesta nel modo seguente:

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

Nota

Quando il livello di compatibilità del database viene impostato su 90, l'impostazione di ANSI_WARNINGS su ON comporta l'impostazione implicita di ARITHABORT su ON. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata su ON in modo esplicito.

L'istruzione non deve essere eseguita con il livello di isolamento READ_UNCOMMITTED o SNAPSHOT.

Se il livello di isolamento o le opzioni non vengono impostate correttamente, la notifica viene eseguita immediatamente dopo l'esecuzione dell'istruzione SELECT. Se una notifica è attiva, è necessario che anche le opzioni SET della connessione che esegue un comando di attivazione della notifica siano impostate come illustrato in precedenza. In caso contrario, il comando avrà esito negativo e verrà generato un errore Transact-SQL.

Se l'istruzione è inclusa in una stored procedure, è necessario impostare le opzioni ANSI_NULLS e QUOTED_IDENTIFIER al momento della creazione della stored procedure. Per ulteriori informazioni, vedere SET ANSI_NULLS (Transact-SQL) e SET QUOTED_IDENTIFIER (Transact-SQL).

Istruzioni da notificare

In generale, è possibile richiedere la notifica di qualsiasi query che può essere utilizzata per creare una vista indicizzata. È possibile impostare la notifica delle istruzioni seguenti:

  • SELECT

    Per le limitazioni e i requisiti specifici per SELECT, vedere la sezione "Istruzioni SELECT supportate" più avanti in questo argomento. Per ulteriori informazioni sull'istruzione SELECT, vedere SELECT (Transact-SQL).

  • EXECUTE

    In questo caso, SQL Server registra una notifica del comando eseguito anziché dell'istruzione EXECUTE. Il comando deve soddisfare i requisiti e le limitazioni per un'istruzione SELECT. Per ulteriori informazioni sull'istruzione EXECUTE, vedere EXECUTE (Transact-SQL).

Se un comando che registra una notifica contiene più istruzioni, Motore di database crea una notifica per ogni istruzione del batch.

Istruzioni SELECT supportate

La notifica delle query è supportata per le istruzioni SELECT che soddisfano i requisiti seguenti:

  • Le colonne previste nell'istruzione SELECT devono essere dichiarate in modo esplicito e i nomi di tabella devono includere due parti. Ciò significa che tutte le tabelle a cui viene fatto riferimento nell'istruzione devono trovarsi nello stesso database.

  • Nell'istruzione non è possibile utilizzare l'asterisco (*) o la sintassi table_name.* per specificare le colonne.

  • Nell'istruzione non è possibile utilizzare colonne senza nome o nomi di colonna duplicati.

  • L'istruzione deve fare riferimento a una tabella di base.

  • L'istruzione non deve fare riferimento a tabelle con colonne calcolate.

  • Le colonne previste nell'istruzione SELECT non possono contenere espressioni di aggregazione, a meno che l'istruzione non utilizzi un'espressione GROUP BY. In questo caso, l'elenco di selezione può contenere le funzioni di aggregazione COUNT_BIG() o SUM(). Non è tuttavia possibile specificare SUM() per una colonna che ammette valori Null. Nell'istruzione non è possibile specificare HAVING, CUBE o ROLLUP.

  • Una colonna prevista nell'istruzione SELECT che viene utilizzata come un'espressione semplice non può essere specificata più volte.

  • L'istruzione non può contenere gli operatori PIVOT o UNPIVOT.

  • L'istruzione non può contenere gli operatori UNION, INTERSECT o EXCEPT.

  • L'istruzione non può fare riferimento a una vista.

  • L'istruzione non può contenere DISTINCT, COMPUTE, COMPUTE BY o INTO.

  • L'istruzione non può fare riferimento a variabili server globali (@@variable_name).

  • L'istruzione non può fare riferimento a tabelle derivate, tabelle temporanee o variabili di tabella.

  • L'istruzione non può fare riferimento a tabelle o viste di altri database o server.

  • L'istruzione non può contenere subquery, outer join o self join.

  • L'istruzione non può fare riferimento ai tipi LOB text, ntext e image.

  • L'istruzione non può utilizzare i predicati full-text CONTAINS o FREETEXT.

  • L'istruzione non può utilizzare le funzioni per i set di righe, incluse OPENROWSET e OPENQUERY.

  • L'istruzione non può utilizzare nessuna delle funzioni di aggregazione AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR o VARP.

  • L'istruzione non può utilizzare le funzioni non deterministiche, incluse le funzioni di rango e le funzioni di windowing.

  • L'istruzione non può contenere funzioni di aggregazione definite dall'utente.

  • L'istruzione non può fare riferimento a tabelle o viste di sistema, incluse le viste del catalogo e le viste a gestione dinamica.

  • L'istruzione non può contenere informazioni relative a FOR BROWSE.

  • L'istruzione non può fare riferimento a una coda.

  • L'istruzione non può contenere istruzioni condizionali che non possono essere modificate o che non restituiscono risultati, ad esempio WHERE 1=0.

  • L'istruzione non può specificare l'hint di blocco READPAST.

  • L'istruzione non deve fare riferimento a nessuna coda di Service Broker (QUEUE).

  • L'istruzione non deve fare riferimento a sinonimi.

  • L'istruzione non deve includere confronti o espressioni basati su tipi di dati double o real.

  • L'istruzione non deve utilizzare l'espressione TOP.

Batch e stored procedure

Se una richiesta di sottoscrizione viene eseguita per un batch o una stored procedure, verrà eseguita una richiesta di sottoscrizione distinta per ogni istruzione eseguita all'interno del batch o della stored procedure.

Le istruzioni EXECUTE non registreranno una notifica, ma trasferiranno la richiesta di notifica al comando eseguito. Nel caso di un batch, il contesto verrà applicato alle istruzioni eseguite e verranno applicate le stesse regole illustrate in precedenza.

Sottoscrizioni duplicate

L'invio di un duplicato di una sottoscrizione attiva fa sì che la la sottoscrizione esistente venga rinnovata utilizzando il nuovo valore di timeout specificato. Una sottoscrizione duplicata soddisfa le condizioni seguenti:

  • La query è inviata dallo stesso utente nello stesso contesto del database.

  • Vengono utilizzati lo stesso modello, gli stessi valori dei parametri, lo stesso ID di notifica e lo stesso percorso di recapito.

Pertanto, se viene richiesta una notifica per query identiche, verrà inviata una sola notifica. Questo riguarda una query duplicata in un batch o una query in una stored procedure chiamata più volte.

Vedere anche

Riferimento

Concetti