CLR 통합 시작
적용 대상: SQL Server
이 문서에서는 .NET Framework CLR(공용 언어 런타임)과 Microsoft SQL Server 통합을 사용하여 데이터베이스 개체를 컴파일하는 데 필요한 네임스페이스 및 라이브러리에 대한 개요를 제공합니다. 또한 이 문서에서는 Microsoft Visual C# 및 Visual Basic으로 작성된 작은 CLR 저장 프로시저를 작성, 컴파일 및 실행하는 방법을 보여줍니다.
필수 네임스페이스
기본 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
팁
Linux에서 CLR 데이터베이스 개체 로드는 지원되지만 .NET Framework를 사용하여 빌드해야 합니다(SQL Server CLR 통합은 .NET Core 또는 .NET 5 이상 버전을 지원하지 않음). 또한 EXTERNAL_ACCESS
UNSAFE
사용 권한 집합이 있는 CLR 어셈블리는 Linux에서 지원되지 않습니다.
"헬로 월드" 저장 프로시저 작성
다음 Visual C# 또는 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!";
}
}
이 프로그램에는 공용 클래스에 대한 정적 메서드 하나가 포함되어 있습니다. 이 메서드는 짧은 텍스트 메시지를 출력할 관리되는 데이터베이스 개체를 만들기 위해 SqlContext 및 SqlPipe,라는 새로운 클래스 두 개를 사용합니다. 또한 이 메서드는 "Hello world!" 문자열을 out
매개 변수 값으로 할당합니다. 이 메서드는 SQL Server에서 저장 프로시저로 선언한 다음 Transact-SQL 저장 프로시저와 같은 방식으로 실행할 수 있습니다.
이 프로그램을 라이브러리로 컴파일하고 SQL Server에 로드한 다음 저장 프로시저로 실행합니다.
"헬로 월드" 저장 프로시저 컴파일
SQL Server에서는 .NET Framework 재배포 가능 파일을 기본적으로 설치합니다. 이러한 파일에는 csc.exe
및 vbc.exe
, Visual C# 및 Visual Basic 프로그램에 대한 명령줄 컴파일러가 포함됩니다. 예제를 컴파일하려면 csc.exe
또는 vbc.exe
가 포함된 디렉터리를 가리키도록 경로 변수를 수정해야 합니다. .NET Framework의 기본 설치 경로는 다음과 같습니다.
C:\Windows\Microsoft.NET\Framework\(version)
버전에는 설치된 .NET Framework의 버전 번호가 포함되어 있습니다. 예시:
C:\Windows\Microsoft.NET\Framework\v4.8.0
경로에 .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에서 "헬로 월드" 저장 프로시저 로드 및 실행
샘플 프로시저가 성공적으로 컴파일되면 SQL Server에서 테스트할 수 있습니다. 이렇게 하려면 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!
"헬로 월드" 저장 프로시저 샘플 제거
샘플 저장 프로시저 실행을 마쳤으면 테스트 데이터베이스에서 프로시저 및 어셈블리를 제거할 수 있습니다.
먼저 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;
다음 단계
SQL Server의 CLR 통합에 대한 자세한 내용은 다음 리소스를 참조하세요.