Condividi tramite


Creazione di una query da notificare

Data aggiornamento: 14 aprile 2006

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] In SQL Server 2005 l'impostazione di ANSI_WARNINGS su ON comporta l'impostazione implicita di ARITHABORT su ON quando il livello di compatibilità del database è impostato su 90. Se il livello di compatibilità del database è impostato su 80 o un valore inferiore, l'opzione ARITHABORT deve essere impostata in modo esplicito su ON.

Se 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 supporta 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 e UNPIVOT.
  • L'istruzione non può contenere gli operatori UNION, INTERSECT e 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 avere confronti o espressioni basati su tipi di dati double o real.

Batch e stored procedure

Se una richiesta di sottoscrizione viene eseguita per un batch o una stored procedure, verrà eseguita una richiesta di sottoscrizione separata 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

Concetti

Creazione di viste indicizzate

Altre risorse

SELECT (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

14 aprile 2006

Nuovo contenuto:
  • Aggiunta della restrizione in "Istruzioni SELECT supportate": l'istruzione non deve fare riferimento a tabelle con colonne calcolate.