Страница на Создание индексированных представлений содержит ряд ограничений:
Оператор SELECT в представлении не может содержать следующие элементы синтаксиса Transact-SQL:
...
Определяемая пользователем агрегатная функция CLR.
В настоящее время нет даже возможности описывать агрегат CLR как детерминированный (по крайней мере, если API будет согласованным). Атрибут SqlFunctionAttribute имеет свойство IsDeterministic
. Нет такого свойства в SqlUserDefinedAggregateAttribute
Полезно рассуждать о вещах, если учесть, почему существует так много ограничений для индексированных представлений.
Те, что в агрегатах, имеют довольно простое объяснение - вам разрешено использовать только агрегаты (например, SUM
и COUNT_BIG
), обладающие свойством, что SQL Server сможет корректировать значения или добавлять или удалить строки из индекса на основе чисто из подмножества строк, являющихся предметом текущей транзакции.
например. если у представления есть строка с ID
= 19, COUNT_BIG
= 5 и SUM
= 96, и транзакция удаляет 3 строки с ID
19, чье значение SUM
добавляет к 43, тогда оно может обновить эта строка вида будет COUNT_BIG
= 2 и SUM
= 53. Кроме того, если бы транзакция удалила 5 строк с ID
= 19, это привело бы к удалению строки.
Обратите внимание, что в любом случае нам не нужно проверять какие-либо другие строки таблицы, чтобы определить, имеют ли они ID
= 19.
Так как же SQL Server может надеяться на достижение аналогичной функциональности с помощью пользовательского агрегата? Текущий интерфейс для определенных пользователем агрегатов не имеет необходимой вам поддержки (ему также потребуется интерфейс типа триггера).