사용자 정의 함수User-Defined Functions

프로그래밍 언어의 함수처럼 SQL ServerSQL Server 사용자 정의 함수는 매개 변수를 받아들이고 복잡한 계산과 같은 동작을 수행하며 해당 작업의 결과를 값으로 반환합니다.Like functions in programming languages, SQL ServerSQL Server user-defined functions are routines that accept parameters, perform an action, such as a complex calculation, and return the result of that action as a value. 반환 값은 단일 스칼라 값이나 결과 집합일 수 있습니다.The return value can either be a single scalar value or a result set.

사용자 정의 함수 User-defined functions

사용하는 이유Why use them?

  • 모듈식 프로그래밍을 허용합니다.They allow modular programming.

    함수를 한 번 만들어 데이터베이스에 저장한 후에는 프로그램에서 여러 번 호출할 수 있습니다.You can create the function once, store it in the database, and call it any number of times in your program. 사용자 정의 함수는 프로그램 원본 코드에 관계없이 수정할 수 있습니다.User-defined functions can be modified independently of the program source code.

  • 작업을 더 빨리 실행할 수 있습니다.They allow faster execution.

    저장 프로시저와 마찬가지로 Transact-SQLTransact-SQL 사용자 정의 함수는 계획을 캐시하고 반복 실행에 다시 사용함으로써 Transact-SQLTransact-SQL 코드의 컴파일 비용을 줄입니다.Similar to stored procedures, Transact-SQLTransact-SQL user-defined functions reduce the compilation cost of Transact-SQLTransact-SQL code by caching the plans and reusing them for repeated executions. 즉, 사용자 정의 함수를 매번 다시 구문 분석하고 최적화할 필요가 없기 때문에 더 빨리 실행할 수 있습니다.This means the user-defined function does not need to be reparsed and reoptimized with each use resulting in much faster execution times.

    CLR 함수는 계산 태스크, 문자열 조작 및 비즈니스 논리 면에서 Transact-SQLTransact-SQL 함수보다 더 뛰어난 성공을 제공합니다.CLR functions offer significant performance advantage over Transact-SQLTransact-SQL functions for computational tasks, string manipulation, and business logic. Transact-SQLTransact-SQL 함수는 데이터를 많이 액세스하는 논리에 더 적합합니다. functions are better suited for data-access intensive logic.

  • 네트워크 트래픽을 줄일 수 있습니다.They can reduce network traffic.

    단일 스칼라 식으로 표현할 수 없는 일부 복잡한 제약 조건을 기반으로 데이터를 필터링하는 작업을 함수로 표현할 수 있습니다.An operation that filters data based on some complex constraint that cannot be expressed in a single scalar expression can be expressed as a function. 그런 다음 WHERE 절에서 이 함수를 호출하여 클라이언트에 전송되는 행 수를 줄일 수 있습니다.The function can then invoked in the WHERE clause to reduce the number or rows sent to the client.

참고

쿼리에 포함된 Transact-SQLTransact-SQL 사용자 정의 함수는 단일 스레드(직렬 실행 계획)에서만 실행할 수 있습니다. Transact-SQLTransact-SQL user-defined functions in queries can only be executed on a single thread (serial execution plan).

함수 유형 Types of functions

스칼라 함수Scalar Function
사용자 정의 스칼라 함수는 RETURNS 절에 정의된 유형의 단일 데이터 값을 반환합니다.User-defined scalar functions return a single data value of the type defined in the RETURNS clause. 인라인 스칼라 함수에는 함수 본문이 없으며 스칼라 값이 단일 문의 결과입니다.For an inline scalar function, there is no function body; the scalar value is the result of a single statement. 다중 문 스칼라 함수의 함수 본문은 BEGIN...END 블록으로 정의되며 여기에는 단일 값을 반환하는 일련의 Transact-SQLTransact-SQL 문이 포함됩니다.For a multistatement scalar function, the function body, defined in a BEGIN...END block, contains a series of Transact-SQLTransact-SQL statements that return the single value. 반환 유형은 text, ntext, image, cursortimestamp를 제외한 모든 데이터 형식일 수 있습니다.The return type can be any data type except text, ntext, image, cursor, and timestamp. Examples.

테이블 반환 함수Table-Valued Functions
사용자 정의 테이블 값 함수는 table 데이터 형식을 반환합니다.User-defined table-valued functions return a table data type. 인라인 테이블 반환 함수에는 함수 본문이 없으며 테이블이 단일 SELECT 문의 결과 집합입니다.For an inline table-valued function, there is no function body; the table is the result set of a single SELECT statement. Examples.

시스템 함수System Functions
SQL ServerSQL Server에서는 다양한 작업을 수행하는 데 사용되는 다양한 시스템 함수를 제공합니다. provides many system functions that you can use to perform a variety of operations. 기본 제공 함수는 수정할 수 없습니다.They cannot be modified. 자세한 내용은 기본 제공 함수(Transact-SQL), 시스템 저장 함수(Transact-SQL)동적 관리 뷰 및 함수(Transact-SQL)를 참조하세요.For more information, see Built-in Functions (Transact-SQL), System Stored Functions (Transact-SQL), and Dynamic Management Views and Functions (Transact-SQL).

지침 Guidelines

한 문을 취소하고 모듈(트리거, 저장 프로시저 등)의 다음 문을 실행하도록 하는 Transact-SQLTransact-SQL 오류는 함수 내에서 다르게 처리됩니다. Transact-SQLTransact-SQL errors that cause a statement to be canceled and continue with the next statement in the module (such as triggers or stored procedures) are treated differently inside a function. 함수에서 그러한 오류가 발생하면 함수의 실행이 중단됩니다.In functions, such errors cause the execution of the function to stop. 이에 따라 함수를 호출한 문도 취소됩니다.This in turn causes the statement that invoked the function to be canceled.

BEGIN...END 블록 내에 있는 문은 어떠한 부작용도 유발하지 않습니다.The statements in a BEGIN...END block cannot have any side effects. 함수의 부작용으로는 데이터베이스 테이블 수정과 같은 함수 외부 범위를 갖는 리소스 상태의 영구적인 변경을 들 수 있습니다.Function side effects are any permanent changes to the state of a resource that has a scope outside the function such as a modification to a database table. 함수의 문에서 변경할 수 있는 것은 로컬 커서나 변수와 같은 함수의 로컬 개체뿐입니다.The only changes that can be made by the statements in the function are changes to objects local to the function, such as local cursors or variables. 함수에서 수행할 수 없는 동작의 예로는 데이터베이스 테이블의 수정, 함수에서 로컬로 사용되지 않는 커서 작업, 전자 메일 보내기, 카탈로그 수정 시도 및 사용자에게 반환되는 결과 집합 생성 등이 있습니다.Modifications to database tables, operations on cursors that are not local to the function, sending e-mail, attempting a catalog modification, and generating a result set that is returned to the user are examples of actions that cannot be performed in a function.

참고

SQL ServerSQL Server에서는 CREATE FUNCTION 문이 실행될 때 존재하지 않는 리소스에 대해 부작용이 생기는 경우에는 이 문을 실행하지만If a CREATE FUNCTION statement produces side effects against resources that do not exist when the CREATE FUNCTION statement is issued, SQL ServerSQL Server executes the statement. 이 문이 호출되는 경우에는 SQL ServerSQL Server 에서 이 함수가 실행되지 않습니다.However, SQL ServerSQL Server does not execute the function when it is invoked.

쿼리에 지정된 함수가 실제로 실행되는 횟수는 최적화 프로그램에서 작성한 실행 계획마다 다릅니다.The number of times that a function specified in a query is actually executed can vary between execution plans built by the optimizer. 예를 들면 WHERE 절의 하위 쿼리에서 호출하는 함수가 있습니다.An example is a function invoked by a subquery in a WHERE clause. 하위 쿼리 및 그 함수가 실행되는 횟수는 최적화 프로그램에서 선택한 액세스 경로에 따라 다릅니다.The number of times the subquery and its function is executed can vary with different access paths chosen by the optimizer.

함수의 유효한 문 Valid statements in a function

함수에서 사용할 수 있는 문의 유형은 다음과 같습니다.The types of statements that are valid in a function include:

  • 함수에서 로컬로 사용되는 데이터 변수와 커서를 정의하는 데 사용되는 DECLARE 문DECLARE statements can be used to define data variables and cursors that are local to the function.

  • SET을 사용하여 스칼라 및 테이블 지역 변수에 값을 할당하는 것과 같이 함수의 로컬 개체에 값 할당Assignments of values to objects local to the function, such as using SET to assign values to scalar and table local variables.

  • 함수에서 커서 선언, 열기, 닫기, 할당 취소 등 로컬 커서를 참조하는 커서 작업.Cursor operations that reference local cursors that are declared, opened, closed, and deallocated in the function. 클라이언트에 데이터를 반환하는 FETCH 문은 사용할 수 없습니다.FETCH statements that return data to the client are not allowed. INTO 절을 사용하여 지역 변수에 값을 할당하는 FETCH 문만 사용할 수 있습니다.Only FETCH statements that assign values to local variables using the INTO clause are allowed.

  • TRY...CATCH 문을 제외한 흐름 제어 문Control-of-flow statements except TRY...CATCH statements.

  • 함수에서 로컬로 사용되는 변수에 값을 할당하는 식이 있는 선택 목록이 포함된 SELECT 문SELECT statements containing select lists with expressions that assign values to variables that are local to the function.

  • 함수에서 로컬로 사용되는 테이블 변수를 수정하는 UPDATE, INSERT 및 DELETE 문UPDATE, INSERT, and DELETE statements modifying table variables that are local to the function.

  • 확장 저장 프로시저를 호출하는 EXECUTE 문EXECUTE statements calling an extended stored procedure.

기본 제공 시스템 함수Built-in system functions

다음과 같은 비결정적 기본 제공 함수는 Transact-SQL 사용자 정의 함수에 사용할 수 있습니다.The following nondeterministic built-in functions can be used in Transact-SQL user-defined functions.

CURRENT_TIMESTAMPCURRENT_TIMESTAMP @@MAX_CONNECTIONS@@MAX_CONNECTIONS
GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS @@PACK_RECEIVED@@PACK_RECEIVED
GETDATEGETDATE @@PACK_SENT@@PACK_SENT
GETUTCDATEGETUTCDATE @@PACKET_ERRORS@@PACKET_ERRORS
@@CONNECTIONS@@CONNECTIONS @@TIMETICKS@@TIMETICKS
@@CPU_BUSY@@CPU_BUSY @@TOTAL_ERRORS@@TOTAL_ERRORS
@@DBTS@@DBTS @@TOTAL_READ@@TOTAL_READ
@@IDLE@@IDLE @@TOTAL_WRITE@@TOTAL_WRITE
@@IO_BUSY@@IO_BUSY

다음과 같은 비결정적 기본 제공 함수는 Transact-SQL 사용자 정의 함수에 사용할 수 없습니다.The following nondeterministic built-in functions cannot be used in Transact-SQL user-defined functions.

NEWIDNEWID RANDRAND
NEWSEQUENTIALIDNEWSEQUENTIALID TEXTPTRTEXTPTR

결정적 및 비결정적 기본 제공 시스템 함수 목록은 결정적 함수 및 비결정적 함수를 참조하세요.For a list of deterministic and nondeterministic built-in system functions, see Deterministic and Nondeterministic Functions.

스키마 바운드 함수 Schema-bound functions

CREATE FUNCTION에서는 테이블, 뷰, 다른 사용자 정의 함수와 같은 참조하는 개체의 스키마에 함수를 바인드하는 SCHEMABINDING 절을 지원합니다.CREATE FUNCTION supports a SCHEMABINDING clause that binds the function to the schema of any objects it references, such as tables, views, and other user-defined functions. 스키마 바운드 함수에서 참조하는 개체는 변경하거나 삭제할 수 없습니다.An attempt to alter or drop any object referenced by a schema-bound function fails.

CREATE FUNCTION에서 SCHEMABINDING 절을 지정하려면 먼저 다음 조건이 만족되어야 합니다.These conditions must be met before you can specify SCHEMABINDING in CREATE FUNCTION:

  • 함수에서 참조하는 모든 뷰와 사용자 정의 함수도 스키마 바운드이어야 합니다.All views and user-defined functions referenced by the function must be schema-bound.

  • 함수에서 참조하는 모든 개체가 함수와 같은 데이터베이스에 있어야 합니다.All objects referenced by the function must be in the same database as the function. 개체는 한 부분 또는 두 부분으로 된 이름을 사용하여 참조해야 합니다.The objects must be referenced using either one-part or two-part names.

  • 함수에서 참조하는 모든 개체(테이블, 뷰, 사용자 정의 함수)에 대해 REFERENCES 권한이 있어야 합니다.You must have REFERENCES permission on all objects (tables, views, and user-defined functions) referenced in the function.

    ALTER FUNCTION을 사용하여 스키마 바인딩을 제거할 수 있습니다.You can use ALTER FUNCTION to remove the schema binding. ALTER FUNCTION 문에서 WITH SCHEMABINDING 절 없이 함수를 다시 정의해야 합니다.The ALTER FUNCTION statement should redefine the function without specifying WITH SCHEMABINDING.

매개 변수 지정 Specifying parameters

사용자 정의 함수에서는 0이나 더 많은 입력 매개 변수를 사용하고 스칼라 값 또는 테이블을 반환합니다.A user-defined function takes zero or more input parameters and returns either a scalar value or a table. 하나의 함수에 최대 1024개의 입력 매개 변수를 지정할 수 있습니다.A function can have a maximum of 1024 input parameters. 함수의 매개 변수에 기본값이 지정되면 기본값을 가져오는 함수를 호출할 때 DEFAULT 키워드를 지정해야 합니다.When a parameter of the function has a default value, the keyword DEFAULT must be specified when calling the function to get the default value. 이 동작은 매개 변수 생략이 기본값을 의미하기도 하는 사용자 정의 저장 프로시저의 기본값이 있는 매개 변수와 다릅니다.This behavior is different from parameters with default values in user-defined stored procedures in which omitting the parameter also implies the default value. 사용자 정의 함수는 출력 매개 변수를 지원하지 않습니다.User-defined functions do not support output parameters.

추가 예제 More examples!

태스크 설명Task Description 항목Topic
Transact-SQL 사용자 정의 함수를 만드는 방법에 대해 설명합니다.Describes how to create a Transact-SQL user-defined function. 사용자 정의 함수 만들기(데이터베이스 엔진)Create User-defined Functions (Database Engine)
CLR 함수를 만드는 방법에 대해 설명합니다.Describes how create a CLR function. CLR 함수 만들기Create CLR Functions
사용자 정의 집계 함수를 만드는 방법에 대해 설명합니다.Describes how to create a user-defined aggregate function 사용자 정의 집계 만들기Create User-defined Aggregates
Transact-SQL 사용자 정의 함수를 수정하는 방법에 대해 설명합니다.Describes how to modify a Transact-SQL user-defined function. 사용자 정의 함수 수정Modify User-defined Functions
사용자 정의 함수를 삭제하는 방법에 대해 설명합니다.Describes how to delete a user-defined function. 사용자 정의 함수 삭제Delete User-defined Functions
사용자 정의 함수를 실행하는 방법에 대해 설명합니다.Describes how to execute a user-defined function. 사용자 정의 함수 실행Execute User-defined Functions
사용자 정의 함수의 이름을 바꾸는 방법에 대해 설명합니다.Describes how to rename a user-defined function 사용자 정의 함수 이름 바꾸기Rename User-defined Functions
사용자 정의 함수의 정의를 보는 방법에 대해 설명합니다.Describes how to view the definition of a user-defined function. 사용자 정의 함수 보기View User-defined Functions