다음을 통해 공유


사용자 정의 함수

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

프로그래밍 언어의 함수와 마찬가지로 SQL Server 사용자 정의 함수는 매개 변수를 받아들이고, 복잡한 계산과 같은 작업을 수행하고, 해당 작업의 결과를 값으로 반환하는 루틴입니다. 반환 값은 단일 스칼라 값 또는 결과 집합일 수 있습니다.

사용자 정의 함수의 장점

사용자 정의 함수(UDF)를 사용하는 이유는 무엇인가요?

  • 모듈식 프로그래밍. 함수를 한 번 생성하여 데이터베이스에 저장한 다음 프로그램에서 여러 번 호출할 수 있습니다. 사용자 정의 함수는 프로그램 소스 코드와 독립적으로 수정할 수 있습니다.

  • 더 빠른 실행. 저장 프로시저와 마찬가지로, Transact-SQL 사용자 정의 함수는 계획을 캐싱하고 반복 실행에 재사용함으로써 Transact-SQL 코드의 컴파일 비용을 줄여줍니다. 즉, 사용자 정의 함수를 사용할 때마다 복구하고 다시 최적화할 필요가 없으므로 실행 시간이 훨씬 빨라집니다.

    CLR 함수는 계산 작업, 문자열 조작 및 비즈니스 논리에 대해 Transact-SQL 함수보다 상당한 성능 이점을 제공합니다. Transact-SQL 함수는 데이터 액세스 집약적인 논리에 더 적합합니다.

  • 네트워크 트래픽 감소. 단일 스칼라 식으로는 표현할 수 없는 복잡한 제약 조건에 따라 데이터를 필터링하는 작업은 함수로 표현할 수 있습니다. 그런 다음 WHERE 절에서 이 함수를 호출하여 클라이언트에 전송되는 행 수를 줄일 수 있습니다.

Important

쿼리의 Transact-SQL UDF는 단일 스레드(직렬 실행 계획)에서만 실행할 수 있습니다. 따라서 UDF를 사용하면 병렬 쿼리 처리가 억제됩니다. 병렬 쿼리 처리에 대한 자세한 내용은 쿼리 처리 아키텍처 가이드를 참조하세요.

함수 유형

스칼라 함수

사용자 정의 스칼라 함수는 RETURNS 절에 정의된 형식의 단일 데이터 값을 반환합니다. 인라인 스칼라 함수의 경우 반환되는 스칼라 값은 단일 문의 결과입니다. 다중 문 스칼라 함수의 경우 함수 본문에는 단일 값을 반환하는 일련의 Transact-SQL 문이 포함될 수 있습니다. 반환 유형은 text, ntext, image, cursortimestamp를 제외한 모든 데이터 형식일 수 있습니다. 예시는 사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하십시오.

테이블 반환 함수

사용자 정의 테이블 값 함수(TVF)는 테이블 데이터 형식을 반환합니다. 인라인 테이블 값 함수의 경우 함수 본문이 없으며 테이블은 단일 SELECT 문의 결과 집합입니다. 예시는 사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하십시오.

시스템 함수

SQL Server는 다양한 작업을 수행하는 데 사용할 수 있는 많은 시스템 함수를 제공합니다. 이러한 함수는 수정할 수 없습니다. 자세한 내용은 기본 제공 함수(Transact-SQL), 시스템 저장 함수(Transact-SQL)동적 관리 뷰 및 함수(Transact-SQL)를 참조하세요.

지침

문이 취소되고 모듈의 다음 문(예: 트리거 또는 저장 프로시저)으로 계속 진행되도록 하는 Transact-SQL 오류는 함수 내에서 다르게 처리됩니다. 함수에서는 이러한 오류로 인해 함수 실행이 중지됩니다. 그러면 함수를 호출한 문이 취소됩니다.

BEGIN...END 블록의 문은 부정적인 영향을 미칠 수 있습니다. 함수의 부정적인 영향이란 데이터베이스 테이블 수정과 같이 함수 외부에 범위가 있는 리소스의 상태에 대한 영구적인 변경을 말합니다. 함수의 문으로 변경할 수 있는 유일한 변경 내용은 로컬 커서 또는 변수와 같이 함수에 로컬인 개체에 대한 변경뿐입니다. 데이터베이스 테이블 수정, 함수에 로컬이 아닌 커서에 대한 작업, 이메일 전송, 카탈로그 수정 시도, 사용자에게 반환되는 결과 집합 생성은 함수에서 수행할 수 없는 작업의 예입니다.

CREATE FUNCTION 문이 실행될 때 존재하지 않는 리소스에 대해 CREATE FUNCTION 문이 부정적인 영향을 미치는 경우 SQL Server는 해당 문을 실행합니다. 그러나 SQL Server는 함수가 호출될 때 함수를 실행하지 않습니다.

쿼리에 지정된 함수가 실행되는 횟수는 최적화 프로그램에 의해 구축된 실행 계획에 따라 달라질 수 있습니다. 예를 들어, WHERE 절의 하위 쿼리에 의해 호출되는 함수가 있습니다. 하위 쿼리와 그 함수가 실행되는 횟수는 최적화 프로그램이 선택한 액세스 경로에 따라 달라질 수 있습니다.

결정 함수는 스키마 바인딩이어야 합니다. 결정 함수를 만들 때는 SCHEMABINDING 절을 사용하세요.

사용자 정의 함수에 대한 자세한 정보 및 성능 고려 사항은 {사용자 정의 함수 만들기(데이터베이스 엔진)를 참조하세요.

함수의 유효한 문

함수에서 사용할 수 있는 문의 유형은 다음과 같습니다.

  • DECLARE 문을 사용하여 함수에 로컬인 데이터 변수 및 커서를 정의할 수 있습니다.

  • SET를 사용하여 스칼라 및 테이블 지역 변수에 값을 할당하는 것과 같이 함수의 로컬 개체에 값 할당

  • 함수에서 선언, 열기, 닫기 및 할당 해제되는 로컬 커서를 참조하는 커서 연산. 클라이언트에 데이터를 반환하는 FETCH 문은 허용되지 않습니다. INTO 절을 사용하여 지역 변수에 값을 할당하는 FETCH 문만 허용됩니다.

  • TRY...CATCH 문을 제외한 흐름 제어 명령문

  • 함수에 로컬인 변수에 값을 할당하는 식과 함께 선택 목록이 포함된 SELECT 문은 허용되지 않습니다.

  • 함수에 로컬인 테이블 변수를 수정하는 UPDATE, INSERTDELETE 문.

  • 확장 저장 프로시저를 호출하는 EXECUTE 문.

기본 제공 시스템 함수

다음과 같은 비결정적 기본 제공 함수는 Transact-SQL 사용자 정의 함수에 사용할 수 있습니다.

  • CURRENT_TIMESTAMP
  • GET_TRANSMISSION_STATUS
  • GETDATE
  • GETUTCDATE
  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@PACKET_ERRORS
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE

다음과 같은 비결정 기본 제공 함수는 Transact-SQL 사용자 정의 함수에서 사용할 수 없습니다.

  • NEWID
  • NEWSEQUENTIALID
  • RAND
  • TEXTPTR

결정 및 비결정 내장 시스템 함수 목록은 결정 및 비결정 함수를 참조하세요.

스키마 바운드 함수

CREATE FUNCTION은(는) 테이블, 뷰 및 기타 사용자 정의 함수와 같이 함수가 참조하는 모든 개체의 스키마에 함수를 바인딩하는 SCHEMABINDING 절을 지원합니다. 스키마 바운드 함수에서 참조하는 개체는 변경하거나 삭제할 수 없습니다.

이러한 조건이 충족되어야 CREATE FUNCTION에서 SCHEMABINDING을 지정할 수 있습니다.

  • 함수가 참조하는 모든 뷰 및 사용자 정의 함수는 스키마에 바인딩되어야 합니다.

  • 함수가 참조하는 모든 개체는 함수와 동일한 데이터베이스에 있어야 합니다. 개체는 한 부분 또는 두 부분으로 된 이름을 사용하여 참조해야 합니다.

  • 함수에서 참조하는 모든 개체(테이블, 뷰 및 사용자 정의 함수)에 대해 REFERENCES 권한이 있어야 합니다.

ALTER FUNCTION을 사용하여 스키마 바인딩을 제거할 수 있습니다. ALTER FUNCTION 문은 WITH SCHEMABINDING을 지정하지 않고 함수를 재정의해야 합니다.

매개 변수 지정

사용자 정의 함수는 0개 이상의 입력 매개 변수를 받아 스칼라 값 또는 테이블을 반환합니다. 함수에는 최대 1024개의 입력 매개 변수를 사용할 수 있습니다. 함수의 매개 변수에 기본값이 있는 경우 함수를 호출할 때 DEFAULT 키워드를 지정해야 기본값을 가져올 수 있습니다. 이 동작은 매개 변수를 생략해도 기본값을 의미하는 사용자 정의 저장 프로시저의 기본값이 있는 매개 변수와 다릅니다. 사용자 정의 함수는 출력 매개 변수를 지원하지 않습니다.

참고 항목