다음을 통해 공유


CLR 통합 시작

이 항목에서는 .NET Framework CLR(공용 언어 런타임)과 SQL Server 통합을 사용하여 데이터베이스 개체를 컴파일하는 데 필요한 네임스페이스 및 라이브러리에 대한 개요를 제공합니다. 또한 이 항목에서는 Microsoft Visual C#으로 작성된 간단한 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  
  

이 간단한 프로그램에는 공용 클래스의 단일 정적 메서드가 포함되어 있습니다. 이 메서드는 두 개의 새 클래스를 SqlContextSqlPipe사용하고 관리되는 데이터베이스 개체를 만들어 간단한 텍스트 메시지를 출력합니다. 또한 이 메서드는 "Hello world!" 문자열을 out 매개 변수의 값으로 할당합니다. 이 메서드는 저장 프로시저에서 저장 프로시저로 선언할 수 Transact-SQL.

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

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

Microsoft .NET Framework 재배포 파일은 기본적으로 제공됩니다. 이러한 파일에는 visual C# 및 Visual Basic 프로그램의 명령줄 컴파일러인 csc.exe 및 vbc.exe포함됩니다. 샘플을 컴파일하려면 경로 변수를 수정하여 csc.exe 또는 vbc.exe포함하는 디렉터리를 가리킵니다. 다음은 .NET Framework의 기본 설치 경로입니다.

C:\Windows\Microsoft.NET\Framework\(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  

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

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

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

CLR(공용 언어 런타임) 코드를 실행하는 기능은 SQL Server에서 기본적으로 OFF로 설정됩니다. CLR 코드는 sp_configure 시스템 저장 프로시저를 사용하여 사용하도록 설정할 수 있습니다. 자세한 내용은 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 프로시저 명령을 사용하여 프로시저를 제거합니다.

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 저장 프로시저
SQL Server In-Process 특정 확장을 ADO.NET
CLR 데이터베이스 개체 디버깅
CLR 통합 보안