다음을 통해 공유


방법: 공용 언어 런타임 통합을 사용하여 SQL Server 집계 만들기 및 실행

SQL CLR(공용 언어 런타임) 데이터베이스 프로젝트에 집계 항목을 추가하여 SQL Server 집계를 만듭니다. 배포된 후에는 관리 코드로 만든 집계를 다른 SQL Server 집계와 마찬가지로 호출하고 실행할 수 있습니다.

SQL Server 집계를 구현하려면 Init, Accumulate, Merge 및 Terminate 메서드가 필요합니다. 자세한 내용은 Microsoft 웹 사이트의 SQL Server 온라인 설명서에서 Requirements for CLR User-Defined Aggregates를 참조하십시오.

참고

표시되는 대화 상자와 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.

SQL Server 집계 만들기

SQL Server 집계를 만들려면

  1. 기존의 SQL CLR 데이터베이스 프로젝트를 열거나 새 프로젝트를 만듭니다. 자세한 내용은 방법: SQL Server 공용 언어 런타임 통합을 사용하는 데이터베이스 개체의 프로젝트 만들기을 참조하십시오.

  2. 프로젝트 메뉴에서 새 항목 추가를 선택합니다.

  3. 새 항목 추가 대화 상자에서 집계를 선택합니다.

  4. 새 집계의 이름을 입력합니다.

  5. 집계가 실행될 때 실행할 코드를 추가합니다. 이 절차 다음에 나오는 첫 번째 예제를 참조하십시오.

  6. 집계를 SQL Server에 배포합니다. 자세한 내용은 방법: SQL Server에 SQL CLR 데이터베이스 프로젝트 항목 배포을 참조하십시오.

    중요

    SQL Server 2005 및 SQL Server 2008에서는 .NET Framework 2.0, 3.0 또는 3.5 버전으로 빌드된 SQL Server 프로젝트만 지원합니다. 배포 하려고 하는 경우는 SQL Server 프로젝트를 SQL Server 2005 또는 SQL Server 2008, 오류 메시지가 나타납니다: Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(어디 AssemblyName 배포 하는 어셈블리의 이름입니다). 자세한 내용은 방법: SQL Server 공용 언어 런타임 통합을 사용하는 데이터베이스 개체의 프로젝트 만들기을 참조하십시오.

  7. SQL Server에서 집계를 실행하여 디버깅합니다. 이 절차 다음에 나오는 두 번째 예제를 참조하십시오.

예제

이 예제에서는 집계를 만들어 모음을 셉니다. 이 집계는 문자열 데이터 형식의 열에서 모음을 셉니다. 집계는 다음 네 개의 필수 메서드, 다중 스레드를 실행할 수 있는 포함: Init, 축적, 병합, 및 종료.

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();
    }
}

집계를 배포한 후에는 SQL Server에서 이를 실행하고 올바른 데이터가 반환되는지 확인함으로써 테스트합니다. 이 쿼리는 Contact 테이블의 LastNames 열에 있는 모든 값에 대한 모음 카운트의 결과 집합을 반환합니다.

참고

AdventureWorks2005를 사용하는 경우에는 샘플 Transact-SQL 코드에서 Person.Person을 Person.Contact로 대체합니다.

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

참고 항목

작업

방법: SQL Server 공용 언어 런타임 통합을 사용하는 데이터베이스 개체의 프로젝트 만들기

방법: 공용 언어 런타임 통합을 사용하여 SQL Server 저장 프로시저 만들기 및 실행

방법: 공용 언어 런타임 통합을 사용하여 SQL Server 트리거 만들기 및 실행

방법: 공용 언어 런타임 통합을 사용하여 SQL Server 사용자 정의 함수 만들기 및 실행

방법: 공용 언어 런타임 통합을 사용하여 SQL Server 사용자 정의 형식 만들기 및 실행

연습: 관리 코드로 저장 프로시저 만들기

방법: SQL CLR 저장 프로시저 디버깅

참조

SQL CLR 데이터베이스 프로젝트 및 데이터베이스 개체의 특성

개념

SQL Server CLR 통합 소개(ADO.NET)

관리 코드를 사용하여 데이터베이스 개체를 만드는 경우의 이점

관리 코드로 SQL Server 개체 만들기