Понимание типа столбца в индексированном представлении в SQL Server 2008 R2
-
10-10-2019 - |
Вопрос
Мы создали индексированное представление таким SQL:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
Также после создания представления мы установили кластерный уникальный индекс в столбце Таблицы 1_ID.
Итак, просмотр состоит из двух столбцов:
Table1_ID
Table2TotalCount
У нас есть два вопроса:
- Если мы используем
Count(1)
или жеCount_BIG(1)
вместоCount_BIG(*)
, SQL не позволяет нам устанавливать индекс в Table1_id - Как мы можем контролировать тип второго столбца (
Table2TotalCount
) - SQL дает длинный нулевой введите в этот столбец. Но мы хотим установить int не нулевой введите в этот столбец. После создания представления мы не можем найти способ изменить тип столбца. Также T-SQL мы используем для создания представления, всегда возвращайте значения int в Table2totalcount.
Решение
Вы должны использовать count_big (*). Это одно из ограничений на Создание индексированного представления:
Оператор SELECT в представлении не может содержать следующие элементы синтаксиса Transact-SQL:
- Count (count_big (*) разрешен.)
Вы можете создать второе представление, которое не индексируется, что ссылается на это первое представление, и приводит тип данных столбца подсчета на ваш желаемый тип (и, возможно, использует isnull () для предотвращения нулевого свойства)
Другие советы
Это, вероятно, потому, что вы рассчитываете на выражение вместо поля или
*
. Анкет С использованиемcount(1)
дает тот же результат, что иcount(*)
, т.е. считает количество записей, поэтому нет причин использоватьcount(1)
.Использовать
count
вместоcount_big
получитьint
вместоbigint
(длинная). (В документации конкретно говорится, что единственная разница между ними - это тип возврата.) Я не знаю, почему значение является нулевым какcount
Никогда не возвращает NULL, но это может быть одинаковым для всех заполнителей и, вероятно, невозможно контролировать.