다음을 통해 공유


결정 함수 및 비결정 함수

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 웨어하우스Microsoft Fabric 미리 보기의 SQL 데이터베이스

결정 함수는 특정 입력 값 집합과 데이터베이스의 동일한 상태가 주어지면 언제 호출해도 항상 동일한 결과를 반환합니다. 비결정적 함수는 액세스하는 데이터베이스 상태가 동일하게 유지되더라도 특정 입력 값 집합으로 호출될 때마다 서로 다른 결과를 반환할 수 있습니다. 예를 들어 함수는 AVG 이전에 설명한 한정을 고려할 때 항상 동일한 결과를 반환하지만 GETDATE 현재 datetime 값을 반환하는 함수는 항상 다른 결과를 반환합니다.

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

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

이 문서에서는 기본 제공 시스템 함수의 결정과 확장 저장 프로시저에 대한 호출이 포함된 경우 사용자 정의 함수의 결정 속성에 미치는 영향에 대해 설명합니다.

함수가 결정적인지 확인

함수에 대한 is_deterministic 개체 속성을 쿼리하여 함수가 결정적인지 여부를 확인할 수 있습니다. 다음 예제에서는 함수 Sales.CalculateSalesTax 가 결정적인지 확인합니다.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

기본 제공 함수 결정론

사용자는 기본 제공 함수의 결정에 영향을 줄 수 없습니다. 각 기본 제공 함수는 SQL Server에서 함수를 구현하는 방법에 따라 결정적이거나 비결정적입니다. 예를 들어 쿼리에서 절을 지정해 ORDER BY 도 해당 쿼리에 사용되는 함수의 결정성은 변경되지 않습니다.

모든 문자열 기본 제공 함수는 FORMAT을 제외하고 결정적입니다. 이러한 함수 목록은 문자열 함수를 참조하세요.

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

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

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

함수 설명
모든 집계 함수 모든 집계 함수는 and OVER 절로 ORDER BY 지정되지 않는 한 결정적입니다. 이러한 함수 목록은 집계 함수를 참조하세요.
CAST datetime, smalldatetime 또는 sql_variant와 함께 사용하는 경우를 제외하고 결정적입니다.
CONVERT 이러한 조건 중 하나가 존재하지 않으면 결정적입니다.

원본 유형이 sql_variant인 경우

대상 유형이 sql_variant이고 소스 유형이 비결정입니다.

소스 또는 대상 유형이 datetime 또는 smalldatetime이고 다른 소스 또는 대상 유형이 문자 문자열이며 비결정 스타일이 지정됩니다. 결정적이 되려면 스타일 매개 변수가 상수여야 합니다. 또한 스타일 20과 21을 제외한 100보다 작거나 같은 스타일은 비결정입니다. 100보다 큰 스타일(스타일 106, 107, 109, 113 제외)은 결정적입니다.
CHECKSUM 를 제외한 CHECKSUM(*)결정적
ISDATE 함수 CONVERT 와 함께 CONVERT 사용되는 경우에만 결정적 스타일 매개 변수가 지정되고 스타일이 0, 100, 9 또는 109와 같지 않습니다.
RAND RAND초기값 매개 변수가 지정된 경우에만 결정적입니다.

구성, 커서, 메타데이터, 보안 및 시스템 통계 함수는 모두 비결정적입니다. 이러한 함수의 목록을 볼 수 있습니다.

다른 범주의 다음 기본 제공 함수는 항상 비결정입니다.

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

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

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

함수 내부에서 호출되는 경우 확장 저장 프로시저는 클라이언트에 결과 집합을 반환할 수 없습니다. 결과 집합을 클라이언트에 반환하는 Open Data Services API에는 반환 코드 FAIL가 있습니다.

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

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