결정적 함수 및 비결정적 함수Deterministic and Nondeterministic Functions

결정적 함수는 데이터베이스의 상태가 같을 경우 특정 입력 값 집합으로 호출될 때마다 항상 동일한 결과를 반환합니다.Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. 비결정적 함수는 액세스하는 데이터베이스의 상태가 동일하게 유지되더라도 특정 입력 값 집합으로 호출될 때마다 다른 결과를 반환할 수 있습니다.Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same. 예를 들어 AVG 함수는 항상 위에서 설명된 조건에 따라 동일한 결과를 반환하지만 현재 날짜/시간 값을 반환하는 GETDATE 함수는 항상 다른 결과를 반환합니다.For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.

사용자 정의 함수에는 SQL Server 데이터베이스 엔진SQL Server Database Engine 에서 함수를 호출하는 계산 열의 인덱스를 통해 또는 함수를 참조하는 인덱싱된 뷰를 통해 함수의 결과를 인덱싱할 수 있는지 여부를 결정하는 여러 가지 속성이 있습니다.There are several properties of user-defined functions that determine the ability of the SQL Server 데이터베이스 엔진SQL Server Database Engine to index the results of the function, either through indexes on computed columns that call the function, or through indexed views that reference the function. 함수의 결정성이 이러한 속성 중 하나입니다.The determinism of a function is one such property. 예를 들어 뷰에서 비결정적 함수를 참조하면 뷰에 클러스터형 인덱스를 만들 수 없습니다.For example, a clustered index cannot be created on a view if the view references any nondeterministic functions. 결정성을 비롯한 함수 속성에 대한 자세한 내용은 사용자 정의 함수를 참조하세요.For more information about the properties of functions, including determinism, see User-Defined Functions.

이 항목에서는 기본 제공 시스템 함수의 결정성을 확인하고 확장 저장 프로시저 호출이 포함될 경우 사용자 정의 함수의 결정적 속성에 주는 효과를 설명합니다.This topic identifies the determinism of built-in system functions and the effect on the deterministic property of user-defined functions when it contains a call to extended stored procedures.

기본 제공 함수 결정성Built-in Function Determinism

기본 제공 함수의 결정성에는 영향을 줄 수 없습니다.You cannot influence the determinism of any built-in function. 각 기본 제공 함수는 SQL ServerSQL Server에서 함수를 구현하는 방식에 따라 결정적이거나 비결정적입니다.Each built-in function is deterministic or nondeterministic based on how the function is implemented by SQL ServerSQL Server. 예를 들어 쿼리에서 ORDER BY 절을 지정하는 경우 해당 쿼리에서 사용된 함수의 결정성이 변경되지 않습니다.For example, specifying an ORDER BY clause in a query does not change the determinism of a function that used in that query.

모든 기본 제공 문자열 함수는 결정적입니다.All of the string built-in functions are deterministic. 이러한 함수 목록은 문자열 함수(Transact-SQL)를 참조하세요.For a list of these functions, see String Functions (Transact-SQL).

문자열 함수 이외의 기본 제공 함수 범주에 속하는 다음 기본 제공 함수는 항상 결정적입니다.The following built-in functions from categories of built-in functions other than string functions are always deterministic.

ABSABS DATEDIFFDATEDIFF POWERPOWER
ACOSACOS DAYDAY RADIANSRADIANS
ASINASIN DEGREESDEGREES ROUNDROUND
ATANATAN EXPEXP SIGNSIGN
ATN2ATN2 FLOORFLOOR SINSIN
CEILINGCEILING ISNULLISNULL SQUARESQUARE
COALESCECOALESCE ISNUMERICISNUMERIC SQRTSQRT
COSCOS LOGLOG TANTAN
COTCOT LOG10LOG10 YEARYEAR
DATALENGTHDATALENGTH MONTHMONTH
DATEADDDATEADD NULLIFNULLIF

다음 함수는 항상 결정적이지는 않지만 함수를 결정적인 방식으로 지정하면 인덱싱된 뷰 또는 계산 열의 인덱스에서 사용할 수 있습니다.The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

함수Function 설명Comments
모든 집계 함수all aggregate functions 모든 집계 함수는 OVER 및 ORDER BY 절로 지정되지 않는 한 결정적입니다.All aggregate functions are deterministic unless they are specified with the OVER and ORDER BY clauses. 이러한 함수 목록은 집계 함수(Transact-SQL)를 참조하세요.For a list of these functions, see Aggregate Functions (Transact-SQL).
CASTCAST datetime, smalldatetime또는 sql_variant와 함께 사용하지 않을 경우 결정적입니다.Deterministic unless used with datetime, smalldatetime, or sql_variant.
CONVERTCONVERT 다음과 같은 경우를 제외하고 결정적입니다.Deterministic unless one of these conditions exists:



원본 유형이 sql_variant인 경우Source type is sql_variant.

대상 유형이 sql_variant 이고 해당 원본 유형이 비결정적인 경우Target type is sql_variant and its source type is nondeterministic.

원본 또는 대상 유형이 datetime 이거나 smalldatetime이고 다른 원본 또는 대상 유형이 문자열이며 비결정적 스타일을 지정한 경우Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified. 결정적이려면 스타일 매개 변수가 상수여야 합니다.To be deterministic, the style parameter must be a constant. 또한 100 이하의 스타일(스타일 20 및 21 제외)은 비결정적입니다.Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. 100보다 큰 스타일(스타일 106, 107, 109, 113 제외)은 결정적입니다.Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.
CHECKSUMCHECKSUM CHECKSUM()을 제외하고 모두 결정적입니다.Deterministic, with the exception of CHECKSUM().
ISDATEISDATE CONVERT 함수와 함께 사용하고 CONVERT 스타일 매개 변수가 지정되고 스타일이 0, 100, 9 또는 109가 아닌 경우에만 결정적입니다.Deterministic only if used with the CONVERT function, the CONVERT style parameter is specified and style is not equal to 0, 100, 9, or 109.
RANDRAND RAND는 seed 매개 변수가 지정된 경우에만 결정적입니다.RAND is deterministic only when a seed parameter is specified.

구성, 커서, 메타데이터, 보안 및 시스템 통계 함수는 모두 비결정적입니다.All the configuration, cursor, metadata, security, and system statistical functions are nondeterministic. 이러한 함수 목록은 구성 함수(Transact-SQL), 커서 함수(Transact-SQL), 메타데이터 함수(Transact-SQL), 보안 함수(Transact-SQL)시스템 통계 함수(Transact-SQL)를 참조하세요.For a list of these functions, see Configuration Functions (Transact-SQL), Cursor Functions (Transact-SQL), Metadata Functions (Transact-SQL), Security Functions (Transact-SQL), and System Statistical Functions (Transact-SQL).

그 밖의 범주에 속하는 다음 기본 제공 함수는 항상 비결정적입니다.The following built-in functions from other categories are always nondeterministic.

@@CONNECTIONS</span><span class="sxs-lookup">@@CONNECTIONS</span></span> GETDATEGETDATE
@@CPU_BUSY</span><span class="sxs-lookup">@@CPU_BUSY</span></span> GETUTCDATEGETUTCDATE
@@DBTS</span><span class="sxs-lookup">@@DBTS</span></span> GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS
@@IDLE</span><span class="sxs-lookup">@@IDLE</span></span> LAGLAG
@@IO_BUSY</span><span class="sxs-lookup">@@IO_BUSY</span></span> LAST_VALUELAST_VALUE
@@MAX_CONNECTIONS</span><span class="sxs-lookup">@@MAX_CONNECTIONS</span></span> LEADLEAD
@@PACK_RECEIVED</span><span class="sxs-lookup">@@PACK_RECEIVED</span></span> MIN_ACTIVE_ROWVERSIONMIN_ACTIVE_ROWVERSION
@@PACK_SENT</span><span class="sxs-lookup">@@PACK_SENT</span></span> NEWIDNEWID
@@PACKET_ERRORS</span><span class="sxs-lookup">@@PACKET_ERRORS</span></span> NEWSEQUENTIALIDNEWSEQUENTIALID
@@TIMETICKS</span><span class="sxs-lookup">@@TIMETICKS</span></span> NEXT VALUE FORNEXT VALUE FOR
@@TOTAL_ERRORS</span><span class="sxs-lookup">@@TOTAL_ERRORS</span></span> NTILENTILE
@@TOTAL_READ</span><span class="sxs-lookup">@@TOTAL_READ</span></span> PARSENAMEPARSENAME
@@TOTAL_WRITE</span><span class="sxs-lookup">@@TOTAL_WRITE</span></span> PERCENTILE_CONTPERCENTILE_CONT
AT TIME ZONEAT TIME ZONE PERCENTILE_DISCPERCENTILE_DISC
CUME_DISTCUME_DIST PERCENT_RANKPERCENT_RANK
CURRENT_TIMESTAMPCURRENT_TIMESTAMP RANDRAND
DENSE_RANKDENSE_RANK RANKRANK
FIRST_VALUEFIRST_VALUE ROW_NUMBERROW_NUMBER
TEXTPTRTEXTPTR

함수에서 확장 저장 프로시저 호출Calling Extended Stored Procedures from Functions

확장 저장 프로시저는 데이터베이스에 의도하지 않은 영향을 줄 수 있기 때문에 확장 저장 프로시저를 호출하는 함수는 비결정적입니다.Functions that call extended stored procedures are nondeterministic, because the extended stored procedures can cause side effects on the database. 의도하지 않은 영향으로는 테이블 업데이트와 같은 데이터베이스의 전역 상태 변경이나 파일 수정 또는 전자 메일 메시지 보내기와 같은 파일 또는 네트워크 등의 외부 리소스 변경이 있습니다.Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network; for example, modifying a file or sending an e-mail message. 사용자 정의 함수에서 확장 저장 프로시저를 실행할 때 일관된 결과 집합이 반환되지는 않습니다.You should not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. 데이터베이스에 의도하지 않은 영향을 주는 사용자 정의 함수는 권장되지 않습니다.User-defined functions that create side effects on the database are not recommended.

함수 내부에서 확장 저장 프로시저를 호출하면 확장 저장 프로시저가 클라이언트에 결과 집합을 반환할 수 없습니다.When called from inside a function, the extended stored procedure cannot return result sets to the client. 클라이언트에 결과 집합을 반환하는 개방형 데이터 서비스 API에는 FAIL 반환 코드가 포함됩니다.Any Open Data Services API that returns result sets to the client will have a return code of FAIL.

확장 저장 프로시저는 SQL ServerSQL Server에 다시 연결할 수 있지만The extended stored procedure can connect back to SQL ServerSQL Server. 확장 저장 프로시저를 호출한 원래 함수와 동일한 트랜잭션을 조인할 수는 없습니다.However, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

일괄 처리 또는 저장 프로시저에서 호출하는 경우와 마찬가지로 확장 저장 프로시저는 MicrosoftMicrosoft 가 실행되고 있는 SQL ServerSQL Server 보안 계정 컨텍스트에서 실행됩니다.Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the MicrosoftMicrosoft Windows security account under which SQL ServerSQL Server is running. 확장 저장 프로시저의 소유자는 프로시저를 실행하는 다른 사용자에게 사용 권한을 부여할 때 이 점을 고려해야 합니다.The owner of the extended stored procedure should consider this when granting permissions to other users to execute the procedure.