Пользовательские агрегатные функции в MS SQL Server? - PullRequest
12 голосов
/ 04 сентября 2008

Как я могу создать собственную функцию агрегирования в MS SQL Server? Пример очень поможет.

1 Ответ

1 голос
/ 29 октября 2008

SQL Server 2000 официально не поддерживает пользовательские агрегатные функции. Однако недавно мне также потребовалась эта функциональность, и я нашел эту статью поучительной:
http://weblogs.sqlteam.com/jeffs/articles/1490.aspx

Это немного хакерство: требуется доступ к расширенным процедурам sp_OA___.

В итоге вы можете моделировать агрегатную функцию с серией из четырех функций-оболочек, каждая из которых выполняет одну из следующих задач:

  1. Создать объект ActiveX, который может содержать состояние в запросе. Вызовите это до выполнения запроса.
    • Выполнить фактическое агрегирование с использованием объекта ActiveX.
    • Очистить состояние объекта ActiveX на границах GROUP BY
    • Уничтожить объект. Вызовите это после выполнения запроса и во время обработки ошибок.

Затем вы включаете элементы 2 и 3 в список выбора для вашего запроса, и элемент 2 также должен быть включен в существующую агрегатную функцию без эффектов, такую ​​как MAX () или MIN (). Вы также можете использовать эту технику для кумулятивных функций, чтобы делать такие вещи, как номера строк.

В некоторых комментариях предполагается, что оптимизатор может попытаться свести на нет эффекты агрегации, оптимизировав вызовы при некоторых обстоятельствах, хотя я ожидаю, что это действительно будет очень редкий случай. Однако я нашел этот вопрос, потому что я отнесся к этим предупреждениям достаточно серьезно, чтобы продолжить поиск чего-то лучшего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...