Обратите внимание, что теперь в атрибуте SqlFunction
содержится значение свойства DataAccess = DataAccessKind.Read, указывая на то, что функция читает данные из базы.
ПРЕДУПРЕЖДЕНИЕ
Обратите внимание также на то, что на
этот раз для доступа к данным мы используем SqlResultSet вместо
SqlDataReader. Дело в том, что одновременно читать из базы и работать с
возвращаемым набором записей нельзя – возникает исключение с сообщением о
том, что данное соединение уже используется. Возможно, данная особенность
поведения будет изменена при выпуске финальной версии. Но пока единственным
способом написать подобную функцию является чтение данных целиком до начала
формирования выходного набора данных.
Агрегирующие функции
Большинству разработчиков для построения своих приложений
вполне хватает стандартного набора агрегирующих функций. Однако теперь настал
праздник и для редких любителей сделать что-то необычное – в новом MS SQL
Server можно реализовать свой способ выйти за пределы SUM, AVG и СOUNT.
Создаются они при помощи оператора CREATE AGGREGATE:
На этот раз написания одного метода недостаточно.
Вместо этого для подсчета агрегатов используются объекты. Идея проста – по мере
просмотра исходных данных мы накапливаем то, что нужно накапливать, а зетем
выводим накопленное в выходной набор. Соответственно для каждого из этих
действий нужно реализовать по методу:
Имя метода
Описание
public void Init()public void Init(input_type value)
Инициализирует объект.
Вызывается один раз на группу агрегируемых значений. Если реализована версия
метода с одним параметром, то SQL Server может использовать ее для передачи
первого значения в группе. Тип параметра value (input_type) должен быть
совместимым с тем типом, который указан как input_sqltype в операторе CREATE
AGGREGATE.
public void Accumulate(input_type value)
После инициализации
объекта, сервер вызывает этот метод по одному разу для каждого агрегируемого
значения. (На список подаваемых на вход значений, помимо состава полей в
операторе GROUP BY, оказывает влияние также и наличие ключевого слова
distinct перед агрегируемым выражением. Как и для встроенных функций, это
ключевое слово приведет к тому, что в список для каждой группы попадут только
различные значения агрегируемого выражения). Тип параметра value должен быть
совместимым с тем типом, который указан как input_sqltype в операторе CREATE
AGGREGATE.
public return_type
Terminate()
Несмотря на страшное
название, этот метод всего лишь должен вернуть то самое агрегированное
значение, которое было вычислено для группы входных значений. Тип результата
должен быть совместимым с тем типом, который указан как return_sqltype в
операторе CREATE AGGREGATE.
public void Merge(udagg_type group)
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.