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