Практическое руководство. Создание и выполнение статистических функций SQL Server в среде CLR

Обновлен: Ноябрь 2007

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

91e6taax.alert_note(ru-ru,VS.90).gifПримечание.

Общее средство интеграции среды выполнения языка (CLR) по умолчанию в Microsoft SQL Server отключено и должно быть включено для использования элементов проекта SQL Server. Для включения интеграции со средой CLR используйте параметр clr enabled хранимой процедуры sp_configure. Дополнительные сведения см. в разделе Включение интеграции со средой CLR.

91e6taax.alert_note(ru-ru,VS.90).gifПримечание.

Статистические функции SQL Server требуют реализации четырех специфических методов; Init, Accumulate, Merge и Terminate. Для получения дополнительных сведений обратитесь к разделу электронной документации по SQL — "Пользовательские статистические функции SQL CLR.NET".

91e6taax.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или версии среды. Для изменения параметров выберите в меню Сервис пункт Импорт и экспорт параметров. Дополнительные сведения см. в разделеПараметры Visual Studio.

Создание статистических функций SQL Server

Чтобы создать статистическую функцию SQL Server:

  1. Откройте существующий Проект SQL Server или создайте новый. Дополнительные сведения см. в разделе Практическое руководство. Создание проекта SQL Server.

  2. В меню Проект выберите команду Добавить новый элемент.

  3. Выберите Статистическая функция в Диалоговое окно "Добавление нового элемента".

  4. Введите Имя для новой статистической функции.

  5. Добавьте код для выполнения при запуске статистической функции. Код представлен в первом примере ниже.

91e6taax.alert_note(ru-ru,VS.90).gifПримечание.

Примеры C++ должны быть скомпилированы с параметром компилятора /clr:safe.

  1. Развертывание статистического выражения на сервере SQL Server. Дополнительные сведения см. в разделе Практическое руководство. Развертывание элементов проекта SQL Server на сервере SQL Server.

  2. Проведите отладку статистической функции, выполнив ее на SQL Server. Обратитесь ко второму примеру, представленному ниже.

Пример

Этот пример создает статистическую функцию для подсчета гласных. Эта статистическая функция подсчитывает гласные в столбце строкового типа данных. Статистическая функция содержит следующие четыре необходимых метода, которые могут выполняться в многопоточном режиме, Init, Accumulate, Merge иTerminate:

Imports System
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server

<Serializable()> _
<SqlUserDefinedAggregate(Format.Native)> _
Public Structure CountVowels

    ' count only the vowels in the passed-in strings
    Private countOfVowels As SqlInt32


    Public Sub Init()
        countOfVowels = 0
    End Sub


    Public Sub Accumulate(ByVal value As SqlString)
        Dim stringChar As String
        Dim indexChar As Int32

        ' for each character in the given parameter
        For indexChar = 0 To Len(value.ToString()) - 1

            stringChar = value.ToString().Substring(indexChar, 1)

            If stringChar.ToLower() Like "[aeiou]" Then

                ' it is a vowel, increment the count
                countOfVowels = countOfVowels + 1
            End If
        Next
    End Sub


    Public Sub Merge(ByVal value As CountVowels)

        Accumulate(value.Terminate())
    End Sub


    Public Function Terminate() As SqlString

        Return countOfVowels.ToString()
    End Function
End Structure
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

[Serializable]
[SqlUserDefinedAggregate(Format.Native)]
public struct CountVowels
{
    // count only the vowels in the passed-in strings
    private SqlInt32 countOfVowels;


    public void Init()
    {
        countOfVowels = 0;
    }


    public void Accumulate(SqlString value)
    {
        // list of vowels to look for
        string vowels = "aeiou";

        // for each character in the given parameter
        for (int i=0; i < value.ToString().Length; i++)
        {
            // for each character in the vowels string
            for (int j=0; j < vowels.Length; j++)
            {
                // convert parameter character to lowercase and compare to vowel
                if (value.Value.Substring(i,1).ToLower() == vowels.Substring(j,1))
                {
                    // it is a vowel, increment the count
                    countOfVowels+=1;
                }
            }
        }
    }


    public void Merge(CountVowels value)
    {
        Accumulate(value.Terminate());
    }


    public SqlString Terminate()
    {
        return countOfVowels.ToString();
    }
}
#include "stdafx.h"

#using <System.dll>
#using <System.Data.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Data;
using namespace System::Data::Sql;
using namespace System::Data::SqlTypes;
using namespace Microsoft::SqlServer::Server;

// In order to debug your Aggregate, add the following to your debug.sql file:
//
// SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
// FROM Person.Contact
// GROUP BY LastName
// ORDER BY LastName
//

[Serializable]
[SqlUserDefinedAggregate(Format::Native)]
public value struct CountVowels
{
public:
    void Init()
    {
        countOfVowels = 0;
    }

    void Accumulate(SqlString value)
    {
        // list of vowels to look for
        String ^vowels = "aeiou";

        // for each character in the given parameter
        for (int i=0; i < value.ToString()->Length; i++)
        {
            // for each character in the vowels string
            for (int j=0; j < vowels->Length; j++)
            {
                // convert parameter character to lowercase and compare to vowel
                if (value.Value->Substring(i, 1)->ToLower() == vowels->Substring(j, 1))
                {
                    // it is a vowel, increment the count
                    countOfVowels+=1;
                    break;
                }
            }
        }
    }

    void Merge(CountVowels value)
    {
        Accumulate(value.Terminate());
    }

    SqlTypes::SqlString Terminate()
    {
        return countOfVowels.ToString();
    }

private:
    // count only the vowels in the passed-in strings
    SqlInt32 countOfVowels;
};

После развертывания статистической функции проверьте ее выполнение на SQL Server и проверьте правильность возвращаемых данных. Этот запрос возвращает результирующий набор — число гласных для всех значений в столбце LastNames в таблице Contact.

SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Contact
GROUP BY LastName
ORDER BY LastName

См. также

Задачи

Практическое руководство. Создание проекта SQL Server

Практическое руководство. Создание и запуск хранимой процедуры SQL Server в среде CLR

Практическое руководство. Создание и запуск триггера CLR SQL Server

Практическое руководство. Создание и выполнение статистических функций SQL Server в среде CLR

Практическое руководство. Создание и запуск пользовательской функции SQL Server в среде CLR

Практическое руководство. Создание и запуск пользовательского типа SQL Server в среде CLR

Пошаговое руководство. Создание хранимой процедуры в управляемом коде

Практическое руководство. Отладка хранимой процедуры SQL CLR

Основные понятия

Введение в интеграцию SQL Server со средой CLR (ADO.NET)

Преимущества использования управляемого кода для создания объектов баз данных

Шаблоны элементов для проектов SQL Server

Ссылки

Атрибуты проектов SQL Server и объектов баз данных

Другие ресурсы

Отладка баз данных SQL в среде CLR