결정적 함수 및 비결정적 함수

업데이트: 2006년 7월 17일

결정적 함수는 데이터베이스의 상태가 같을 경우 특정 입력 값 집합으로 호출될 때마다 항상 동일한 결과를 반환합니다. 비결정적 함수는 액세스하는 데이터베이스의 상태가 동일하게 유지되더라도 특정 입력 값 집합으로 호출될 때마다 다른 결과를 반환할 수 있습니다.

함수를 호출하는 계산 열의 인덱스를 통해 또는 해당 함수를 참조하는 인덱싱된 뷰를 통해 SQL Server 데이터베이스 엔진의 함수 결과 인덱싱 기능을 결정하는 사용자 정의 함수의 속성에는 여러 가지가 있습니다. 함수의 결정성이 이러한 속성 중 하나입니다. 예를 들어 뷰에서 비결정적 함수를 참조하면 뷰에 클러스터형 인덱스를 만들 수 없습니다. 결정성을 비롯한 함수 속성에 대한 자세한 내용은 사용자 정의 함수 디자인 지침을 참조하십시오.

이 항목에서는 기본 제공 시스템 함수의 결정성을 식별하고 확장 저장 프로시저 호출이 포함될 경우 사용자 정의 함수의 결정적 속성에 주는 영향을 설명합니다.

기본 제공 함수 결정성

기본 제공 함수의 결정성에는 영향을 줄 수 없습니다. 각 기본 제공 함수는 Microsoft SQL Server 2005에서 함수를 구현하는 방식에 따라 결정적 또는 비결정적입니다.

집계 및 문자열 기본 제공 함수는 모두 결정적입니다. 이러한 함수 목록은 집계 함수(Transact-SQL)문자열 함수(Transact-SQL)를 참조하십시오.

집계 함수와 문자열 함수 이외의 기본 제공 함수 범주에 속하는 다음 기본 제공 함수는 항상 결정적입니다.

ABS

DATEDIFF

PARSENAME

ACOS

DAY

POWER

ASIN

DEGREES

RADIANS

ATAN

EXP

ROUND

ATN2

FLOOR

SIGN

CEILING

ISNULL

SIN

COALESCE

ISNUMERIC

SQUARE

COS

LOG

SQRT

COT

LOG10

TAN

DATALENGTH

MONTH

YEAR

DATEADD

NULLIF

 

다음 함수는 항상 결정적이지는 않지만 함수를 결정적인 방식으로 지정하면 인덱싱된 뷰 또는 계산된 열의 인덱스에서 사용할 수 있습니다.

함수 설명

CAST

datetime, smalldatetime 또는 sql_variant와 함께 사용하지 않는 경우 결정적입니다.

CONVERT

다음과 같은 경우를 제외하고 결정적입니다.

  • 원본 유형이 sql_variant인 경우
  • 대상 유형이 sql_variant이고 해당 원본 유형이 비결정적인 경우
  • 원본 또는 대상 유형이 datetime이거나 smalldatetime이고 다른 원본 또는 대상 유형이 문자열이며 비결정적 스타일을 지정한 경우. 결정적이려면 스타일 매개 변수가 상수여야 합니다. 또한 스타일 20과 21을 제외하고 100보다 작거나 같은 스타일은 비결정적입니다. 스타일 106, 107, 109 및 113을 제외하고 100보다 큰 스타일은 결정적입니다.

CHECKSUM

CHECKSUM(*)을 제외하고 모두 결정적입니다.

ISDATE

CONVERT 함수와 함께 사용하고 CONVERT 스타일 매개 변수가 지정되고 스타일이 0, 100, 9 또는 109가 아닌 경우에만 결정적입니다.

RAND

RAND는 seed 매개 변수가 지정된 경우에만 결정적입니다.

구성, 커서, 메타데이터, 보안 및 시스템 통계 함수는 모두 비결정적입니다. 이러한 함수의 목록은 구성 함수(Transact-SQL), 커서 함수(Transact-SQL), 메타데이터 함수(Transact-SQL), 보안 함수(Transact-SQL)시스템 통계 함수(Transact-SQL)를 참조하십시오.

그 밖의 범주에 속하는 다음 기본 제공 함수는 항상 비결정적입니다.

@@CONNECTIONS

@@TOTAL_READ

@@CPU_BUSY

@@TOTAL_WRITE

@@DBTS

CURRENT_TIMESTAMP

@@IDLE

GETDATE

@@IO_BUSY

GETUTCDATE

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSION

@@PACK_SENT

NEWID

@@PACKET_ERRORS

NEWSEQUENTIALID

@@TIMETICKS

RAND

@@TOTAL_ERRORS

TEXTPTR

함수에서 확장 저장 프로시저 호출

확장 저장 프로시저는 데이터베이스에 의도하지 않은 영향을 줄 수 있기 때문에 확장 저장 프로시저를 호출하는 함수는 비결정적입니다. 의도하지 않은 영향으로는 테이블 업데이트와 같은 데이터베이스의 전역 상태 변경이나 파일 수정 또는 전자 메일 메시지 보내기와 같은 파일 또는 네트워크 등의 외부 리소스 변경이 있습니다. 사용자 정의 함수에서 확장 저장 프로시저를 실행할 때 일관된 결과 집합이 반환되지는 않습니다. 데이터베이스에 의도하지 않은 영향을 주는 사용자 정의 함수는 권장되지 않습니다.

함수 내부에서 확장 저장 프로시저를 호출하면 확장 저장 프로시저가 클라이언트에 결과 집합을 반환할 수 없습니다. 클라이언트에 결과 집합을 반환하는 개방형 데이터 서비스 API에는 FAIL 반환 코드가 포함됩니다.

확장 저장 프로시저는 SQL Server에 다시 연결할 수 있지만 확장 저장 프로시저를 호출한 원래 함수와 동일한 트랜잭션을 조인할 수는 없습니다.

일괄 처리 또는 저장 프로시저에서 호출하는 경우와 마찬가지로 확장 저장 프로시저는 SQL Server가 실행되고 있는 Microsoft 보안 계정 컨텍스트에서 실행됩니다. 확장 저장 프로시저의 소유자는 프로시저를 실행하는 다른 사용자에게 사용 권한을 부여할 때 이 점을 고려해야 합니다.

참고 항목

개념

사용자 정의 함수 디자인 지침
테이블 값 사용자 정의 함수
인라인 사용자 정의 함수
저장 프로시저를 함수로 다시 작성

관련 자료

사용자 정의 함수 디자인

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역
변경된 내용
  • 원본 또는 대상 유형이 datetime 또는 smalldatetime이 아니고 다른 원본 또는 대상 유형이 문자열이 아니며 비결정적 스타일을 지정하지 않을 경우 CONVERT를 사용하면 결정적 결과가 생성됨을 설명하는 CONVERT 함수에 대한 설명 정보를 추가했습니다.
  • 결정적 스타일과 비결정적 스타일을 분명하게 설명했습니다.