다음을 통해 공유


사용자 정의 함수 실행(데이터베이스 엔진)

사용자 정의 함수는 쿼리에서 호출할 수도 있고 계산 열이나 문자열 식처럼 식이나 문에서 호출할 수도 있습니다. 스칼라 반환 함수는 EXECUTE 문을 사용하여 실행할 수 있습니다.

스칼라 값을 반환하는 사용자 정의 함수 호출

Transact-SQL 문에서 같은 데이터 형식의 스칼라 식이 허용된 모든 위치에서 스칼라 값을 반환하는 사용자 정의 함수를 호출할 수 있습니다. 스칼라 반환 함수는 적어도 두 부분으로 구성된 함수 이름을 사용하여 호출해야 합니다. 다중 부분 이름에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙(Transact-SQL)을 참조하십시오.

쿼리

스칼라 값을 반환하는 사용자 정의 함수는 다음 위치에서 허용됩니다.

  • SELECT 문의 select_list에 있는 expression

    USE AdventureWorks;
    GO
    SELECT ProductID, ListPrice, dbo.ufnGetProductDealerPrice(ProductID, StartDate) AS DealerPrice,
        StartDate, EndDate
    FROM Production.ProductListPriceHistory
    WHERE ListPrice > .0000
    ORDER BY ProductID, StartDate;
    GO
    
  • WHERE 또는 HAVING 절 조건자에 있는 expression 또는 string_expression

    USE AdventureWorks;
    GO
    SELECT ProductID, ListPrice, StartDate, EndDate
    FROM Production.ProductListPriceHistory
    WHERE dbo.ufnGetProductDealerPrice(ProductID, StartDate) > .0000
    ORDER BY ProductID, StartDate;
    GO
    
  • GROUP BY 절의 group_by_expression

  • ORDER BY 절의 order_by_expression

  • UPDATE 문에 있는 SET 절의 expression

    USE AdventureWorks;
    GO
    UPDATE Production.ProductListPriceHistory
    SET ListPrice = dbo.ufnGetProductDealerPrice(ProductID, StartDate)
    WHERE ProductID > 900;
    GO
    
  • INSERT 문에 있는 VALUES 절의 expression

    이러한 위치에서 참조되는 사용자 정의 함수는 논리적으로 행마다 한 번씩 실행됩니다.

CHECK 제약 조건

함수로 전달된 인수 값이 상수 또는 테이블에 있는 열만 참조하는 경우에는 CHECK 제약 조건에서 스칼라 값을 반환하는 사용자 정의 함수를 호출할 수 있습니다. 쿼리 프로세서가 제약 조건을 검사할 때마다 쿼리 프로세서는 현재 검사 중인 행과 관련된 인수 값을 사용하여 함수를 호출합니다. 테이블 소유자는 동시에 테이블의 CHECK 제약 조건에 의해 호출된 사용자 정의 함수의 소유자여야 합니다.

DEFAULT 정의

함수로 전달된 인수 값에 상수만 있는 경우에는 사용자 정의 함수를 DEFAULT 정의의 constant_expression으로 호출할 수 있습니다. 테이블 소유자는 동시에 테이블의 DEFAULT 정의에 의해 호출된 사용자 정의 함수의 소유자여야 합니다.

계산 열

함수로 전달된 인수 값이 상수 또는 테이블에 있는 열만 참조하는 경우에는 함수가 계산 열에 의해 호출될 수 있습니다. 테이블의 소유자는 테이블의 계산 열에 의해 호출된 사용자 정의 함수의 소유자여야 합니다.

할당 연산자

할당 연산자(left_operand = right_operand)는 오른쪽 피연산자로 지정된 식의 스칼라 값을 반환하는 사용자 정의 함수를 호출할 수 있습니다.

흐름 제어 문

스칼라 값을 반환하는 사용자 정의 함수는 부울 식의 흐름 제어 문에서 호출할 수 있습니다.

CASE 식

스칼라 값을 반환하는 사용자 정의 함수는 모든 CASE 식에서 호출할 수 있습니다.

문자열을 반환하는 사용자 정의 함수는 PRINT 문의 string_expr 식으로 호출할 수 있습니다.

함수 및 저장 프로시저

  • 함수 인수는 스칼라 값을 반환하는 사용자 정의 함수에 대한 참조가 될 수 있습니다.

  • 저장 프로시저의 RETURN integer_expression 문은 정수를 integer_expression으로 반환하는 사용자 정의 함수를 호출할 수 있습니다.

  • 사용자 정의 함수의 RETURN return_type_spec 문은 return_type_spec 등의 스칼라 데이터 형식을 반환하는 사용자 정의 함수를 호출할 수 있습니다. 단, 호출한 사용자 정의 함수에서 반환한 값을 호출한 함수의 반환 데이터 형식으로 암시적으로 변환할 수 있어야 합니다.

스칼라 값을 반환하는 사용자 정의 함수 실행

저장 프로시저와 같은 방법으로 스칼라 값을 반환하는 사용자 정의 함수를 실행할 수 있습니다. 스칼라 값을 반환하는 사용자 정의 함수를 실행할 때는 저장 프로시저에서처럼 매개 변수를 지정합니다.

  • 인수 값은 괄호로 묶지 않습니다.

  • 매개 변수 이름을 지정할 수 있습니다.

  • 매개 변수 이름을 지정하면 인수 값이 매개 변수의 순서와 달라도 됩니다.

다음 예에서는 십진수 스칼라 값을 반환하는 사용자 정의 함수를 만듭니다.

IF OBJECT_ID(N'dbo.ufn_CubicVolume', N'FN') IS NOT NULL
    DROP FUNCTION dbo.ufn_CubicVolume;
GO
CREATE FUNCTION dbo.ufn_CubicVolume
-- Input dimensions in centimeters.
   (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
    @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
   RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END;
GO

다음 예에서는 dbo.ufn_CubicVolume 함수를 실행합니다. Transact-SQL EXECUTE 문을 사용하여 함수 정의에 있는 매개 변수와 다른 순서로 인수를 식별합니다.

DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume @CubeLength = 12.3,
                        @CubeHeight = 4.5, @CubeWidth = 4.5;
SELECT @MyDecimalVar;
GO

다음 예에서는 매개 변수 이름을 지정하지 않고 dbo.ufn_CubicVolume 함수를 실행합니다.

DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume 12.3, 4.5, 4.5;
SELECT @MyDecimalVar;
GO

OLE DB 또는 ODBC 응용 프로그램에서 ODBC CALL 구문을 사용하여 dbo.ufn_CubicVolume 함수를 실행할 수도 있습니다.

-- First use SQLBindParam to bind the return value parameter marker
-- to a program variable of the appropriate type
SQLExecDirect(hstmt,
              "{ CALL ? = dbo.ufn_CubicVolume(12.3, 4.5, 4.5) }",
              SQL_NTS);

table 데이터 형식을 반환하는 사용자 정의 함수 호출

SELECT, INSERT, UPDATE 또는 DELETE 문의 FROM 절에서 테이블 식이 허용되는 경우 table을 반환하는 사용자 정의 함수를 호출할 수 있습니다. 테이블을 반환하는 사용자 정의 함수 뒤에 선택적으로 테이블 별칭을 지정할 수 있습니다. 다음 예는 SELECT 문의 FROM 절에서 테이블 반환 함수 dbo.ufnGetContactInformation을 호출하는 것을 보여 줍니다.

USE AdventureWorks;
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(2200);
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(5);
GO

하위 쿼리의 FROM 절에서 테이블을 반환하는 사용자 정의 함수를 호출할 때는 함수 인수가 외부 조인의 열을 참조할 수 없습니다.

정적, 읽기 전용 커서는 SELECT 문에서 열 수 있는 유일한 커서 형식입니다. 이때 SELECT 문의 FROM 절은 table을 반환하는 사용자 정의 함수를 참조해야 합니다.

table을 반환하는 사용자 정의 함수를 참조하는 SELECT 문은 함수를 한 번만 호출합니다.

기본 제공 테이블 반환 함수 호출

테이블 값을 반환하는 몇 가지 기본 제공 테이블 반환 함수가 있습니다. 이러한 기본 제공 사용자 정의 함수를 호출하는 것은 허용되지 않거나 sys 스키마 한정자를 사용하여 수행할 수 있습니다. 기본 제공 테이블 반환 함수에는 sys 스키마 한정자를 사용하여 같은 이름의 사용자 정의 함수와 충돌하는 것을 방지해야 합니다. 다음 예는 시스템 기본 제공 함수 fn_helpcollations를 호출하는 방법을 보여 줍니다.

SELECT *
FROM sys.fn_helpcollations();
GO

테이블 반환 함수에 힌트 사용

사용자 정의 함수를 만들 때 함수 정의를 만드는 모든 쿼리에서 테이블 힌트를 적용할 수 있습니다. Transact-SQL 테이블 반환 함수를 참조하는 뷰에 적용된 힌트는 함수에도 적용됩니다. 이러한 함수는 함수 정의의 힌트와 충돌할 수 있습니다. 자세한 내용은 뷰 확인을 참조하십시오.

CLR 테이블 반환 함수를 참조하는 뷰에는 힌트를 적용할 수 없습니다.

[!참고]

뷰의 힌트를 뷰 정의의 일부인 다중 문 테이블 반환 함수에 적용하는 데이터베이스 엔진 기능은 이후 버전의 SQL Server에서는 제거됩니다.

쿼리의 FROM 절에 있는 테이블 반환 함수의 결과에는 테이블 힌트를 적용할 수 없습니다.