SQL Server 2000 официально не поддерживает пользовательские агрегатные функции. Однако недавно мне также потребовалась эта функциональность, и я нашел эту статью поучительной:
http://weblogs.sqlteam.com/jeffs/articles/1490.aspx
Это немного хакерство: требуется доступ к расширенным процедурам sp_OA___
.
В итоге вы можете моделировать агрегатную функцию с серией из четырех функций-оболочек, каждая из которых выполняет одну из следующих задач:
- Создать объект ActiveX, который может содержать состояние в запросе. Вызовите это до выполнения запроса.
- Выполнить фактическое агрегирование с использованием объекта ActiveX.
- Очистить состояние объекта ActiveX на границах GROUP BY
- Уничтожить объект. Вызовите это после выполнения запроса и во время обработки ошибок.
Затем вы включаете элементы 2 и 3 в список выбора для вашего запроса, и элемент 2 также должен быть включен в существующую агрегатную функцию без эффектов, такую как MAX () или MIN (). Вы также можете использовать эту технику для кумулятивных функций, чтобы делать такие вещи, как номера строк.
В некоторых комментариях предполагается, что оптимизатор может попытаться свести на нет эффекты агрегации, оптимизировав вызовы при некоторых обстоятельствах, хотя я ожидаю, что это действительно будет очень редкий случай. Однако я нашел этот вопрос, потому что я отнесся к этим предупреждениям достаточно серьезно, чтобы продолжить поиск чего-то лучшего.