CLR 함수 만들기
적용 대상: SQL Server 2016(13.x) 이상 버전
Microsoft .NET Framework CLR(공용 언어 런타임)에서 만든 어셈블리로 프로그래밍된 SQL Server 인스턴스 내에서 데이터베이스 개체를 만들 수 있습니다. 공용 언어 런타임에서 제공하는 풍부한 프로그래밍 모델을 사용할 수 있는 데이터베이스 객체에는 집계 함수, 함수, 저장 프로시저, 트리거 및 유형이 포함됩니다.
SQL Server에서 CLR 함수를 만들려면 다음 단계를 수행합니다.
.NET Framework에서 지원하는 언어로 클래스의 정적 메서드로 함수를 정의합니다. 공용 언어 런타임에서 함수를 프로그래밍하는 방법에 대한 자세한 내용은 CLR 사용자 정의 함수를 참조하세요. 그런 다음 적절한 언어 컴파일러를 사용하여 .NET Framework에서 어셈블리를 빌드하는 클래스를 컴파일합니다.
CREATE ASSEMBLY 문을 사용하여 SQL Server에 어셈블리를 등록합니다. SQL Server의 어셈블리에 대한 자세한 내용은 어셈블리(데이터베이스 엔진)를 참조하세요.
CREATE FUNCTION 문을 사용하여 등록된 어셈블리를 참조하는 함수를 만듭니다.
SQL Server에서는 CLR 코드 실행이 기본적으로 해제되어 있습니다. 관리 코드 모듈을 참조하는 데이터베이스 개체를 생성, 변경 및 삭제할 수 있지만, 이러한 참조는 sp_configure(Transact-SQL)를 사용하여 clr enabled 옵션을 사용으로 설정하지 않으면 SQL Server에서 실행되지 않습니다.
Microsoft Visual Studio에서 SQL Server 프로젝트를 배포하면 프로젝트에 지정된 데이터베이스에 어셈블리가 등록됩니다. 프로젝트를 배포해도 SqlFunction 특성으로 주석이 추가된 모든 메서드에 대한 CLR 함수가 데이터베이스에 생성됩니다. 자세한 내용은 CLR 데이터베이스 개체 배포를 참조하세요.
외부 리소스 액세스
CLR 함수를 사용하여 파일, 네트워크 리소스, 웹 서비스, 기타 데이터베이스(SQL Server의 원격 인스턴스 포함)와 같은 외부 리소스에 액세스할 수 있습니다. 이 작업은 .NET Framework의 다양한 클래스(예: System.IO
, System.WebServices
System.Sql
등)를 사용하여 수행할 수 있습니다. 이러한 함수가 포함된 어셈블리는 최소한 이 용도로 설정된 EXTERNAL_ACCESS 권한으로 구성해야 합니다. 자세한 내용은 CREATE ASSEMBLY(Transact-SQL)에서 지원하는 언어를 사용하여 클래스의 정적 메서드로 함수를 정의합니다. SQL 클라이언트 관리 공급자를 사용하여 SQL Server의 원격 인스턴스를 액세스할 수 있습니다. 그러나 CLR 함수에서는 원본 서버에 대한 루프백 연결을 지원하지 않습니다.
SQL Server에서 어셈블리를 만들거나 수정하거나 삭제하려면 다음을 수행합니다.
CLR 함수를 만들려면
네이티브 코드 액세스
CLR 함수는 관리 코드에서 PInvoke
를 사용하여 C 또는 C++로 작성된 코드와 같은 네이티브(관리되지 않는) 코드에 액세스할 수 있습니다(자세한 내용은 관리 코드에서 네이티브 함수 호출 참조). 이렇게 하면 레거시 코드를 CLR UDF로 재사용하거나 네이티브 코드에서 성능에 중요한 UDF를 작성할 수 있으며, UNSAFE 어셈블리를 사용해야 합니다. UNSAFE 어셈블리 사용에 대한 주의 사항은 CLR Integration Code Access Security 을 참조하십시오.