Tipo de columna de la comprensión en vista indizada en SQL Server 2008 R2
-
10-10-2019 - |
Pregunta
crea una vista indizada por ejemplo SQL:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
índice único también después de crear la vista, nos propusimos agrupado en la columna Table1_ID.
Así Vista consiste en dos columnas:
Table1_ID
Table2TotalCount
Tenemos dos preguntas:
- Si usamos
Count(1)
oCount_BIG(1)
en lugar deCount_BIG(*)
, SQL no nos permite indexar conjunto de Table1_ID - ¿Cómo podemos controlar el tipo de la segunda columna (
Table2TotalCount
) - SQL dan una larga anulable escriba a esta columna. Pero queremos conjunto int no anulable tipo de esta columna. Después de la creación de Vista, no podemos encontrar ninguna manera de cambiar el tipo de columna. También T-SQL se utiliza para la creación de vista, siempre vuelven a valores int Table2TotalCount .
Solución
Usted tiene que usar COUNT_BIG (*). Es una de las restricciones a la crear una vista indizada :
La instrucción SELECT en la vista no puede contener los siguientes elementos de sintaxis de Transact-SQL:
- COUNT (COUNT_BIG (*) está permitido.)
Se puede crear una segunda opinión de que no está indexada, que las referencias de este primer punto de vista, y arroja el tipo de datos de la columna de recuento de su tipo deseado (y posiblemente utiliza un ISNULL () para evitar que la propiedad anulable)
Otros consejos
-
Eso es probablemente porque usted está contando con una expresión en lugar de un campo o
*
. Usandocount(1)
da el mismo resultado que contar el número de registroscount(*)
, es decir, lo que no hay razón para usarcount(1)
. -
Uso
count
en lugar decount_big
para obtenerint
en lugar debigint
(largo). (La documentación dice expresamente que la única diferencia entre ellos es el tipo de retorno.) No sé por qué el valor es anulable comocount
nunca vuelve nula, pero que podría ser el mismo para todos los agregados, y, probablemente, no es posible el control.