Детерминированные и недетерминированные функцииDeterministic and Nondeterministic Functions

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Детерминированные функции каждый раз возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных.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 Database EngineSQL Server Database Engine индексировать результаты функции как с помощью индексов вычисляемых столбцов, вызывающих функцию, так и с помощью индексированных представлений, которые на нее ссылаются.There are several properties of user-defined functions that determine the ability of the Компонент SQL Server Database EngineSQL 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 is used in that query.

Все встроенные строковые функции являются детерминированными, кроме FORMAT.All of the string built-in functions are deterministic, except for FORMAT. Список этих функций см. в разделе Строковые функции (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@@CONNECTIONS

GETDATEGETDATE

@@CPU_BUSY@@CPU_BUSY

GETUTCDATEGETUTCDATE

@@DBTS@@DBTS

GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS

@@IDLE@@IDLE

LAGLAG

@@IO_BUSY@@IO_BUSY

LAST_VALUELAST_VALUE

@@MAX_CONNECTIONS@@MAX_CONNECTIONS

LEADLEAD

@@PACK_RECEIVED@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSIONMIN_ACTIVE_ROWVERSION

@@PACK_SENT@@PACK_SENT

NEWIDNEWID

@@PACKET_ERRORS@@PACKET_ERRORS

NEWSEQUENTIALIDNEWSEQUENTIALID

@@TIMETICKS@@TIMETICKS

NEXT VALUE FORNEXT VALUE FOR

@@TOTAL_ERRORS@@TOTAL_ERRORS

NTILENTILE

@@TOTAL_READ@@TOTAL_READ

PARSENAMEPARSENAME

@@TOTAL_WRITE@@TOTAL_WRITE

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

FORMATFORMAT

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. При выполнении расширенной хранимой процедуры из пользовательской функции не следует полагаться на то, что будет возвращен непротиворечивый результирующий набор.Do 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, has 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 Windows, под которой запущен 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 the permissions of this security context, when granting permissions to other users to execute the procedure.