In questa pagina
Messaggio
Codice: 10125
Messaggio in italiano: Impossibile creare %1! sulla vista “%2!” perché utilizza l’aggregazione “%3!”. Provare a eliminare l’aggregazione, a non indicizzare la vista o a utilizzare aggregazioni alternative. Sostituire ad esempio AVG con SUM e COUNT_BIG oppure sostituire COUNT con COUNT_BIG.
Messaggio in inglese: Cannot create %S_MSG on view “%.*ls” because it uses aggregate “%.*ls”. Consider eliminating the aggregate, not indexing the view, or using alternate aggregates. For example, for AVG substitute SUM and COUNT_BIG, or for COUNT, substitute COUNT_BIG.
Spiegazione
Quando si crea un indice su una vista non è possibile usare le seguenti funzioni di aggregazione: COUNT, MIN, MAX e SUM (se fa riferimento a campi che possono essere NULL), AVG, STDEV, STDEVP, VAR, VARP.
Le funzioni di aggregazione non possono essere usate nemmeno in campi che non sono indicizzati.
Un elenco di tutti i vincoli nella creazione di indici sulle viste si può trovare qui:
https://docs.microsoft.com/it-it/sql/relational-databases/views/create-indexed-views
Causa
È stata usata una funzione di aggregazione COUNT, MIN, MAX e SUM (se fa riferimento a campi che possono essere NULL), AVG, STDEV, STDEVP, VAR, VARP all’interno di una vista e si sta cercando di creare un indice sulla vista.
Esempio:
CREATE VIEW V_TEST AS SELECT f1, f2, AVG(f3) as SumOfF3 FROM t1 GROUP BY f1, f2
e poi:
CREATE UNIQUE CLUSTERED INDEX [IDX_1] ON [dbo].[V_TEST] (f1 ASC)
Parametri
%1! rappresenta l’indice che si sta tentando di creare
%2! rappresenta la vista su cui si sta tentando di creare l’indice
%3! rappresenta la funzione che non è possibile usare nella vista se deve essere indicizzata
Soluzione
Non utilizzare le funzioni di aggregazione specificate.
Si possono rimuovere o sostituire con delle funzioni alternative.
Per esempio, COUNT può essere sostituito con COUNT_BIG:
CREATE VIEW V_TEST AS SELECT f1, f2, COUNT(f3) as CountOfF3 FROM t1 GROUP BY f1, f2
diventa
CREATE VIEW V_TEST AS SELECT f1, f2, COUNT_BIG(f3) as CountOfF3 FROM t1 GROUP BY f1, f2
la media si può calcolare utilizzando SUM e COUNT_BIG, purché il campo su cui si fa SUM non accetti campi NULL:
CREATE VIEW V_TEST AS SELECT f1, f2, AVG(f3) as AvgOfF3 FROM t1 GROUP BY f1, f2
diventa
CREATE VIEW V_TEST AS SELECT f1, f2, SUM(f3) / COUNT_BIG(f3) as AvgOfF3 FROM t1 GROUP BY f1, f2
Per MIN e MAX sarebbe possibile usare ROW_NUMBER() e poi selezionare solo la prima riga, ma anche la clausola OVER è vietata, quindi la seguente soluzione non funzionerebbe (vedi errore 10143).