다음을 통해 공유


CLR 스칼라 반환 함수

적용 대상: SQL Server

SVF(스칼라 반환 함수)는 문자열, 정수 또는 비트 값과 같은 단일 값을 반환합니다. 모든 .NET Framework 프로그래밍 언어를 사용하여 관리 코드에서 스칼라 반환 사용자 정의 함수를 만들 수 있습니다. 이러한 함수는 Transact-SQL 또는 기타 관리 코드에서 액세스할 수 있습니다. CLR 통합의 장점과 관리 코드와 Transact-SQL 중에서 선택하는 이점에 대한 자세한 내용은 CLR 통합 개요를 참조 하세요.

CLR 스칼라 반환 함수에 대한 요구 사항

.NET Framework SVF는 .NET Framework 어셈블리 클래스의 메서드로 구현됩니다. SVF에서 반환되는 입력 매개 변수 및 형식은 varchar, char, rowversion, text, ntext, image, timestamp, table 또는 cursor를 제외하고 SQL Server에서 지원하는 스칼라 데이터 형식 중 어느 것이든 될 수 있습니다. SVF는 SQL Server 데이터 형식과 구현 방법의 반환 데이터 형식 간의 일치를 확인해야 합니다. 형식 변환에 대한 자세한 내용은 CLR 매개 변수 데이터 매핑을 참조 하세요.

.NET Framework 언어 로 .NET Framework SVF를 구현하는 경우 함수에 대한 추가 정보를 포함하도록 SqlFunction 사용자 지정 특성을 지정할 수 있습니다. SqlFunction 특성은 함수가 데이터에 액세스하거나 수정하는지, 결정적인지, 함수에 부동 소수점 작업이 포함되는지 여부를 나타냅니다.

스칼라 반환 사용자 정의 함수는 결정적이거나 비결정적일 수 있습니다. 결정적 함수는 특정 입력 매개 변수 집합으로 호출될 때 항상 같은 결과를 반환합니다. 비결정적 함수는 특정 입력 매개 변수 집합을 사용하여 호출할 때 다른 결과를 반환할 수 있습니다.

참고 항목

함수가 동일한 입력 값과 동일한 데이터베이스 상태가 지정된 상태에서 항상 동일한 값을 출력하지 않을 경우에는 함수를 결정적인 함수로 표시하지 마십시오. 함수가 실제로 결정적이지 않은 경우 함수를 결정적으로 표시하면 인덱싱된 뷰와 계산 열이 손상될 수 있습니다. IsDeterministic 속성을 true로 설정하여 함수를 결정적 으로 표시합니다.

테이블 반환 매개 변수

프로시저 또는 함수로 전달되는 사용자 정의 테이블 형식인 TVP(테이블 반환 매개 변수)를 사용하면 여러 개의 데이터 행을 서버로 편리하게 전달할 수 있습니다. TVP는 매개 변수 배열과 유사한 기능을 제공하지만 Transact-SQL과 더 유연하고 긴밀한 통합을 제공합니다. 또한 성능도 향상될 수 있습니다. 또한 TVP는 서버 왕복 횟수를 줄이는 데 도움이 될 수 있습니다. 스칼라 매개 변수 목록과 같이 여러 요청을 서버에 보내는 대신 데이터를 서버에 TVP로 보낼 수 있습니다. 사용자 정의 테이블 형식은 SQL Server 프로세스에서 실행되는 관리되는 저장 프로시저 또는 함수에 테이블 반환 매개 변수로 전달되거나 반환될 수 없습니다. TVP에 대한 자세한 내용은 테이블 반환 매개 변수 사용(데이터베이스 엔진)을 참조하세요.

CLR 스칼라 반환 함수의 예

다음은 데이터에 액세스하고 정수 값을 반환하는 간단한 SVF입니다.

using Microsoft.SqlServer.Server;  
using System.Data.SqlClient;  
  
public class T  
{  
    [SqlFunction(DataAccess = DataAccessKind.Read)]  
    public static int ReturnOrderCount()  
    {  
        using (SqlConnection conn   
            = new SqlConnection("context connection=true"))  
        {  
            conn.Open();  
            SqlCommand cmd = new SqlCommand(  
                "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn);  
            return (int)cmd.ExecuteScalar();  
        }  
    }  
}  
Imports Microsoft.SqlServer.Server  
Imports System.Data.SqlClient  
  
Public Class T  
    <SqlFunction(DataAccess:=DataAccessKind.Read)> _  
    Public Shared Function ReturnOrderCount() As Integer  
        Using conn As New SqlConnection("context connection=true")  
            conn.Open()  
            Dim cmd As New SqlCommand("SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn)  
            Return CType(cmd.ExecuteScalar(), Integer)  
        End Using  
    End Function  
End Class  

코드의 첫 번째 줄은 특성에 액세스하기 위해 Microsoft.SqlServer.Server 를 참조하고 System.Data.SqlClient 는 ADO.NET 네임스페이스에 액세스합니다. (이 네임스페이스에는 SQL Server용 .NET Framework 데이터 공급자인 SqlClient입니다.)

다음으로, 함수는 Microsoft.SqlServer.Server 네임스페이스에 있는 SqlFunction 사용자 지정 특성을 받습니다. 사용자 지정 특성은 UDF(사용자 정의 함수)가 In-process 공급자를 사용하여 서버에서 데이터를 읽는지 여부를 나타냅니다. SQL Server는 UDF가 데이터를 업데이트, 삽입 또는 삭제하는 것을 허용하지 않습니다. SQL Server는 In-process 공급자를 사용하지 않는 UDF의 실행을 최적화할 수 있습니다. DataAccessKind를 DataAccessKind.None으로 설정하여 표시합니다. 다음 줄에서 대상 메서드는 public static(Visual Basic .NET의 경우 공유) 메서드입니다.

Microsoft.SqlServer.Server 네임스페이스에 있는 SqlContext 클래스는 이미 설정된 SQL Server 인스턴스에 대한 연결을 사용하여 SqlCommand 개체에 액세스할 수 있습니다. 여기서는 사용되지 않지만 System.Transactions API(애플리케이션 프로그래밍 인터페이스)를 통해 현재 트랜잭션 컨텍스트를 사용할 수도 있습니다.

함수 본문의 코드 줄 대부분은 System.Data.SqlClient 네임스페이스에 있는 형식을 사용하는 클라이언트 애플리케이션을 작성한 개발자에게 친숙해 보일 것입니다.

[C#]

using(SqlConnection conn = new SqlConnection("context connection=true"))   
{  
   conn.Open();  
   SqlCommand cmd = new SqlCommand(  
        "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn);  
   return (int) cmd.ExecuteScalar();  
}    

[Visual Basic]

Using conn As New SqlConnection("context connection=true")  
   conn.Open()  
   Dim cmd As New SqlCommand( _  
        "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn)  
   Return CType(cmd.ExecuteScalar(), Integer)  
End Using  

SqlCommand 개체를 초기화하여 적절한 명령 텍스트를 지정합니다. 이전 예제에서는 SalesOrderHeader 테이블의 행 수를 계산합니다. 다음으로 cmd 개체의 ExecuteScalar 메서드가 호출됩니다. 쿼리에 따라 int 형식의 값을 반환합니다. 마지막으로 주문 수가 호출자에게 반환됩니다.

이 코드가 FirstUdf.cs 파일에 저장되면 다음과 같이 어셈블리로 컴파일될 수 있습니다.

[C#]

csc.exe /t:library /out:FirstUdf.dll FirstUdf.cs   

[Visual Basic]

vbc.exe /t:library /out:FirstUdf.dll FirstUdf.vb  

참고 항목

/t:library 는 실행 파일이 아닌 라이브러리를 생성해야 했음을 나타냅니다. 실행 파일은 SQL Server에 등록할 수 없습니다.

참고 항목

/clr:pure컴파일된 Visual C++ 데이터베이스 개체는 SQL Server에서 실행할 수 없습니다. 예를 들어 이러한 데이터베이스 개체에는 스칼라 반환 함수가 포함됩니다.

Transact-SQL 쿼리 및 어셈블리 및 UDF를 등록하기 위한 샘플 호출은 다음과 같습니다.

CREATE ASSEMBLY FirstUdf FROM 'FirstUdf.dll';  
GO  
  
CREATE FUNCTION CountSalesOrderHeader() RETURNS INT   
AS EXTERNAL NAME FirstUdf.T.ReturnOrderCount;   
GO  
  
SELECT dbo.CountSalesOrderHeader();  
GO  
  

Transact-SQL에 노출된 함수 이름은 대상 공용 정적 메서드의 이름과 일치할 필요가 없습니다.

참고 항목

CLR 매개 변수 데이터 매핑
CLR 통합 사용자 지정 특성 개요
사용자 정의 함수
CLR 데이터베이스 개체에서 데이터 액세스