CLR 통합으로 작업 시작

이 항목에서는 .NET Framework CLR(공용 언어 런타임)과 Microsoft SQL Server의 통합을 사용하여 데이터베이스 개체를 컴파일하는 데 필요한 네임스페이스 및 라이브러리에 대해 간략하게 설명합니다. 또한 이 항목에서는 Microsoft Visual C#으로 작성된 간단한 CLR 저장 프로시저를 작성, 컴파일 및 실행하는 방법도 보여 줍니다.

필수 네임스페이스

SQL Server 2005부터는 기본적인 CLR 데이터베이스 개체를 개발하는 데 필요한 구성 요소가 SQL Server와 함께 설치됩니다. CLR 통합 기능은 .NET Framework의 일부인 system.data.dll이라는 어셈블리에서 제공되며 이 어셈블리는 GAC(전역 어셈블리 캐시)와 .NET Framework 디렉터리에 있습니다. 이 어셈블리에 대한 참조는 일반적으로 명령줄 도구와 Microsoft Visual Studio에 자동으로 추가되므로 직접 추가하지 않아도 됩니다.

system.data.dll 어셈블리에는 CLR 데이터베이스 개체를 컴파일하는 데 필요한 다음과 같은 네임스페이스가 들어 있습니다.

System.Data

System.Data.Sql

Microsoft.SqlServer.Server

System.Data.SqlTypes

간단한 "Hello World" 저장 프로시저 작성

아래의 Visual C# 또는 Microsoft Visual Basic 코드를 복사하여 텍스트 편집기에 붙여넣고 이름이 "helloworld.cs" 또는 "helloworld.vb"인 파일로 저장합니다.

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;

public class HelloWorldProc
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void HelloWorld(out string text)
    {
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
        text = "Hello world!";
    }
}
Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
 
Public Class HelloWorldProc
    <Microsoft.SqlServer.Server.SqlProcedure> _ 
    Public Shared  Sub HelloWorld(<Out()> ByRef text as String)
        SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)
        text = "Hello world!"
    End Sub
End Class

이 간단한 프로그램에는 공용 클래스에 대한 정적 메서드 하나가 포함되어 있습니다. 이 메서드는 간단한 텍스트 메시지를 출력할 관리되는 데이터베이스 개체를 만들기 위해 SqlContext와 SqlPipe라는 새로운 클래스 두 개를 사용합니다. 또한 이 메서드는 "Hello world!"라는 문자열을 out 매개 변수 값으로 할당합니다. 이 메서드는 SQL Server에서 저장 프로시저로 선언한 다음 Transact-SQL 저장 프로시저와 같은 방식으로 실행할 수 있습니다.

이제 이 프로그램을 라이브러리로 컴파일하고 SQL Server에 로드한 다음 저장 프로시저로 실행해 봅니다.

"Hello World" 저장 프로시저 컴파일

SQL Server에서는 Microsoft .NET Framework 재배포 가능 파일을 기본적으로 설치합니다. 이러한 파일에는 csc.exe와 vbc.exe, 그리고 Visual C# 및 Visual Basic 프로그램용 명령줄 컴파일러가 포함됩니다. 예제를 컴파일하려면 csc.exe 또는 vbc.exe가 포함된 디렉터리를 가리키도록 경로 변수를 수정해야 합니다. .NET Framework의 기본 설치 경로는 다음과 같습니다.

C:\Windows\Microsoft.NET\Framework\(version)

version에는 설치된 .NET Framework 재배포 가능 패키지의 버전 번호가 포함됩니다. 예를 들면 다음과 같습니다.

C:\Windows\Microsoft.NET\Framework\v2.0.31113

경로에 .NET Framework 디렉터리를 추가한 후에는 다음 명령을 사용하여 예제 저장 프로시저를 어셈블리로 컴파일할 수 있습니다. /target 옵션을 사용하면 저장 프로시저를 어셈블리로 컴파일할 수 있습니다.

Visual C# 원본 파일의 경우 다음 명령을 실행합니다.

csc /target:library helloworld.cs 

Visual Basic 원본 파일의 경우 다음 명령을 실행합니다.

vbc /target:library helloworld.vb

이러한 명령은 라이브러리 DLL을 빌드하도록 지정하는 /target 옵션을 사용하여 Visual C# 또는 Visual Basic 컴파일러를 시작합니다.

SQL Server에서 "Hello World" 저장 프로시저 로드 및 실행

예제 프로시저가 성공적으로 컴파일되면 SQL Server에서 테스트해 볼 수 있습니다. 컴파일된 예제 프로시저를 테스트하려면 SQL Server Management Studio를 열고 새 쿼리를 만들어 적절한 테스트 데이터베이스(예: AdventureWorks 예제 데이터베이스)에 연결합니다.

SQL Server에서는 CLR(공용 언어 런타임) 코드를 실행하는 기능이 기본적으로 OFF로 설정되어 있습니다. sp_configure 시스템 저장 프로시저를 사용하여 CLR 코드가 실행되도록 설정할 수 있습니다. 자세한 내용은 CLR 통합 사용을 참조하십시오.

저장 프로시저에 액세스할 수 있게 어셈블리를 만들어야 합니다. 이 예에서는 C:\ 디렉터리에 helloworld.dll 어셈블리를 만들었다고 가정합니다. 쿼리에 다음의 Transact-SQL 문을 추가합니다.

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE

어셈블리가 만들어지면 CREATE PROCEDURE 문을 사용하여 HelloWorld 메서드에 액세스할 수 있습니다. 여기서 저장 프로시저 이름은 "hello"입니다.

CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
-- if the HelloWorldProc class is inside a namespace (called MyNS),
-- the last line in the create procedure statement would be
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld

프로시저가 만들어지면 Transact-SQL로 작성된 일반적인 저장 프로시저와 마찬가지로 프로시저를 실행할 수 있습니다. 다음 명령을 실행하십시오.

DECLARE @J nchar(25)
EXEC hello @J out
PRINT @J

그러면 SQL Server Management Studio 메시지 창에 다음과 같은 메시지가 출력됩니다.

Hello world!
Hello world!

"Hello World" 저장 프로시저 예제 제거

예제 저장 프로시저 실행이 완료되면 프로시저와 어셈블리를 테스트 데이터베이스에서 제거할 수 있습니다.

먼저 drop procedure 명령을 사용하여 프로시저를 제거합니다.

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')
   drop procedure hello

프로시저가 삭제되면 예제 코드가 포함된 어셈블리를 제거할 수 있습니다.

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')
   drop assembly helloworld

참고 항목

개념

CLR 저장 프로시저

ADO.NET에 대한 SQL Server In-Process 전용 확장

CLR 데이터베이스 개체 디버깅

CLR 통합 보안