Понимание типа столбца в индексированном представлении в SQL Server 2008 R2 - PullRequest
1 голос
/ 09 декабря 2010

Мы создали индексированное представление с помощью такого sql:

Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...

Также после создания представления мы устанавливаем кластеризованный уникальный индекс для столбца Table1_ID.
Итак, View состоит из двух столбцов:

Table1_ID
Table2TotalCount

У нас есть два вопроса:

  1. Если мы используем Count(1) или Count_BIG(1) вместо Count_BIG(*), SQL не позволяет нам устанавливать индекс для Table1_ID
  2. Как мы можем контролировать тип второго столбца (Table2TotalCount) - SQL дает long nullable введите этот столбец. Но мы хотим установить для этого столбца тип int, не обнуляемый . После создания просмотра мы не можем найти способ изменить тип столбца. Также t-sql, который мы используем для создания представления, всегда возвращает значения int в Table2TotalCount .

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Вы должны использовать COUNT_BIG (*).Это одно из ограничений на создание индексированного представления :

Оператор SELECT в представлении не может содержать следующие элементы синтаксиса Transact-SQL:

  • COUNT (COUNT_BIG (*) разрешен.)

Можно создать второе неиндексированное представление, которое ссылается на это первое представление и приводит к типу данных столбца count.к вашему желаемому типу (и, возможно, использует ISNULL (), чтобы предотвратить свойство nullable)

0 голосов
/ 09 декабря 2010
  1. Это возможно потому, что вы рассчитываете на выражение вместо поля или *.Использование count(1) дает тот же результат, что и count(*), то есть подсчет количества записей, поэтому нет смысла использовать count(1).

  2. Использовать count вместо count_big чтобы получить int вместо bigint (long).(В документации конкретно сказано, что единственное различие между ними - тип возвращаемого значения.) Я не знаю, почему значение обнуляется, поскольку count никогда не возвращает ноль, но это может быть одинаковым для всех агрегатов, и, вероятно, это невозможноконтроль.

...