Capire tipo di colonna in vista indicizzata in SQL Server 2008 R2
-
10-10-2019 - |
Domanda
Abbiamo creato una vista indicizzata da tale sql:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
indice univoco anche dopo aver creato la vista, abbiamo impostato cluster colonna Table1_ID.
Così View è composta da due colonne:
Table1_ID
Table2TotalCount
Abbiamo due questioni:
- Se usiamo
Count(1)
oCount_BIG(1)
invece diCount_BIG(*)
, SQL non ci permettono di indice impostato su Table1_ID - Come possiamo controllare il tipo di seconda colonna (
Table2TotalCount
) - SQL Give A lunga annullabile digitare a questa colonna. Ma noi vogliamo insieme int non annullabile tipo a questa colonna. Dopo la creazione di vista, non riusciamo a trovare un modo per cambiare il tipo di colonna. Anche T-SQL che usiamo per la creazione di vista, sempre tornare a valori int Table2TotalCount .
Soluzione
Si deve utilizzare COUNT_BIG (*). E 'una delle restrizioni sui creare una vista indicizzata :
L'istruzione SELECT nella visualizzazione non può contenere i seguenti elementi di sintassi Transact-SQL:
- COUNT (COUNT_BIG (*) è consentita.)
Si potrebbe creare una seconda vista che non è indicizzato, che i riferimenti questa prima vista, e getta il tipo di dati della colonna conteggio al tipo desiderato (e, eventualmente, utilizza un ISNULL () per impedire che la proprietà nullable)
Altri suggerimenti
-
Questo è probabilmente perché si contano su un'espressione invece di un campo o
*
. Utilizzandocount(1)
dà lo stesso risultato comecount(*)
, cioè contando il numero di record, quindi non v'è alcun motivo per usocount(1)
. -
L'uso
count
invece dicount_big
per ottenereint
invece dibigint
(lungo). (La documentazione specificamente dice che l'unica differenza tra loro è il tipo di ritorno.) Non so il motivo per cui il valore è annullabile comecount
mai restituisce null, ma che potrebbe essere la stessa per tutti gli aggregati, e, probabilmente, non è possibile il controllo.