Поделиться через


Требования для определяемых пользователем статистических функций CLR

Тип в сборке CLR можно зарегистрировать как определяемую пользователем статистическую функцию, если она реализует необходимую статистическую обработку. Такой контракт состоит из атрибута SqlUserDefinedAggregate и методов статистического контракта. Статистический контракт включает механизм сохранения промежуточного состояния статистической функции и механизм накопления новых значений, состоящий из четырех методов: Init, Accumulate, Merge и Terminate. При соблюдении этих требований можно воспользоваться полным преимуществом определяемых пользователем статистических функций в MicrosoftSQL Server. В следующих подразделах этого раздела содержаться подробности о том, как создать и работать с определяемыми пользователем статистическими функциями. См. пример в разделе Вызов определяемых пользователем статистических функций CLR.

SqlUserDefinedAggregate

Каждая определяемая пользователем статистическая функция должна сопровождаться пользовательским атрибутом SqlUserDefinedAggregate. Данный атрибут указывает SQL Server, что тип соответствует контракту определяемой пользователем статистической функции. Существует два требуемых свойства атрибута SqlUserDefinedAggregate, которые управляют используемым форматом сериализации. В следующей таблице описываются эти свойства.

Свойство

Описание

Формат

Формат сериализации для этого типа. Формат сериализации может быть собственным или определенным пользователем. Каждый формат сериализации имеет свой собственный набор требований.

MaxByteSize

Размер нужен для хранения состояния статистической функции во время вычисления. Максимальный допустимый размер равен 2 ГБ. Можно указать число от 1 до 8000 байт, или -1 для указания значения больше 8000 байт вплоть до 2 ГБ. Для статистической функции с заданной определяемой пользователем сериализацией, MaxByteSize указывает на общий размер сериализованных данных. Рассмотрим статистическую функцию с сериализацией строки из 10 символов (System.Char). При сериализации строки с помощью BinaryWriter, общий размер сериализованной строки равен 22 байтам: 2 байта на символ в Юникоде (UTF-16), умноженные на максимальное количество символов, плюс 2 управляющих байта, добавляемые при сериализации двоичного потока. Поэтому, при определении значения MaxByteSize, должен учитываться общий размер сериализованных данных: размер данных, сериализованных в двоичной форме, плюс служебные данные, добавляемые при сериализации.

Атрибут SqlUserDefinedAggregate в некотором роде подобен атрибуту SqlUserDefinedType. Он также принимает формат для сериализации типа и указывает максимальный размер. Следующая таблица содержит некоторые дополнительные свойства этого атрибута.

IsInvariantToDuplicates

Необязательное свойство. Возвращает значение TRUE, только если статистическая функция инвариантна относительно дубликатов. Например, функции MAX и MIN удовлетворяют этому условия, а функция SUM нет.

IsInvariantToNulls

Необязательное свойство. Указывает, инвариантна ли статистическая функция относительно значений типа NULL. Например, функции MIN и SUM удовлетворяют этому условия, а функция COUNT нет.

IsInvariantToOrder

Зарезервировано для последующего использования. Эта функция не используется в данный момент обработчиком запросов: в настоящее время порядок не гарантируется.

IsNullIfEmpty

Свойство используется обработчиком запросов. Указывает, возвращает ли статистическая функция значения типа NULL, если нет накопленных значений.

Обработчик запросов использует сериализацию, когда требуется распространить временные результаты статистической обработки в рабочих таблицах. Дополнительные сведения об атрибуте SqlUserDefinedAggregate см. в разделе «Класс SqlUserDefinedAggregateAttribute» пакета .NET Framework SDK.

Методы статистической обработки

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

    public void Init();    /* needed for empty group */

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

  public void Accumulate ( input-type value);

input_type должен быть управляемым типом данных SQL Server, эквивалентным типу данных SQL Server, указанному input_sqltype в инструкции CREATE AGGREGATE. Дополнительные сведения см. в разделе Сопоставление данных о параметрах CLR.

Для определяемых пользователем типов входной тип является аналогичным определяемому пользователем типу. Обработчик запросов использует данный метод для накопления статистических значений. Метод вызывается один раз для каждого значения группы, в которой выполняется статистическая обработка. Обработчик запросов всегда вызывает его только после вызова метода Init в данном экземпляре статистического класса. Реализация данного метода должна обновить состояние экземпляра, чтобы отразить накопление передаваемого значения аргумента.

  public void Merge( udagg_class value);

Метод используется для слияния другого экземпляра этого статистического класса с текущим экземпляром. Обработчик запросов использует данный метод для слияния нескольких частичных вычислений статистической обработки.

  public return_type Terminate();

Этот метод завершает статистическое вычисление и возвращает результат статистической обработки. The return_type должен быть управляемым типом данных SQL Server, являющимся управляемым эквивалентом return_sqltype , указанным в инструкции CREATE AGGREGATE. return_type также может быть определяемым пользователем типом.

Параметры, возвращающие табличные значения

Возвращающие табличное значение параметры — это определяемые пользователем табличные типы, которые передаются в процедуру или функцию, предоставляя эффективный способ передачи на сервер нескольких строк данных. Возвращающие табличное значение параметры выполняют функции, аналогичные массивам параметров, но обладают большей гибкостью и лучше интегрируются с Transact-SQL. Они также обеспечивают возможность повышения производительности. Кроме того, возвращающие табличное значение параметры способствуют сокращению циклов приема-передачи данных с сервера и на сервер. Вместо того чтобы отправлять на сервер несколько запросов (как в случае списка скалярных параметров), данные можно отправить в виде возвращающего табличное значение параметра. Определяемый пользователем табличный тип нельзя передавать в виде возвращающего табличное значение параметра в управляемую хранимую процедуру или функцию, которая выполняется в процессе SQL Server. Кроме того, такие процедуры и функции не могут возвращать определяемые пользователем табличные типы. Также возвращающие табличное значение параметры не могут использоваться внутри области контекстного соединения. Однако, возвращающий табличное значение параметр можно использовать с SqlClient в управляемых хранимых процедурах или функциях, выполняемых в процессе SQL Server, если он используется в соединении, отличным от контекстного. Соединение может осуществляться с тем же сервером, который выполняет управляемую процедуру или функцию. Дополнительные сведения о возвращающих табличное значение параметрах см. в разделе Возвращающие табличное значение параметры (компонент Database Engine).