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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Детерминированные функции всегда возвращают один и тот же результат при вызове с определенным набором входных значений и с тем же состоянием базы данных. Недетерминированные функции могут возвращать разные результаты каждый раз, когда они вызываются с определенным набором входных значений, даже если состояние базы данных, к которому они обращаются, остается неизменным. Например, функция AVG всегда возвращает один результат при указанных выше условиях, а функция GETDATE, возвращающая текущие дату и время, всегда возвращает разный результат.

Существует несколько свойств определяемых пользователем функций, определяющих способность SQL Server ядро СУБД индексировать результаты функции, индексы на вычисляемых столбцах, вызывающих функцию, или с помощью индексированных представлений, ссылающихся на функцию. Детерминизм функции — одно из таких свойств. Например, кластеризованный индекс нельзя создать в представлении, если представление ссылается на недетерминированные функции. Дополнительные сведения о свойствах функций, включая детерминизм, см. в разделе Определяемые пользователем функции.

Детерминированные функции должны быть привязаны к схеме. SCHEMABINDING Используйте предложение при создании детерминированной функции.

В этой статье определяется детерминированность встроенных системных функций и влияние на детерминированное свойство определяемых пользователем функций, когда оно содержит вызов расширенных хранимых процедур.

Определение детерминированной функции

Можно проверить, является ли функция детерминированной, запрашивая is_deterministic свойство объекта для функции. В приведенном ниже примере определяется, является ли функция Sales.CalculateSalesTax детерминированной.

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

Детерминированность встроенной функции

Не удается повлиять на детерминированность встроенной функции. Каждая встроенная функция детерминирована или недетерминирована на основе того, как функция реализуется SQL Server. Например, указание предложения ORDER BY в запросе не изменяет детерминированность функции, используемой в этом запросе.

Все встроенные строковые функции являются детерминированными, кроме FORMAT. Список этих функций см. в разделе "Строковые функции" (Transact-SQL).

Следующие встроенные функции, отличные от строковых функций, всегда детерминированы.

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DEGREES
  • EXP
  • ЭТАЖ
  • ISNULL
  • ISNUMERIC
  • ЖУРНАЛ
  • LOG10
  • MONTH
  • NULLIF
  • ПИТАНИЕ
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

Следующие функции не всегда детерминированы, но могут использоваться в индексированных представлениях или индексах для вычисляемых столбцов, когда они указаны детерминированным образом.

Function Комментарии
все агрегатные функции Все агрегатные функции детерминированы, если они не указаны с предложениями OVER и ORDER BY. Список этих функций см. в разделе "Агрегатные функции" (Transact-SQL).
CAST Детерминированные, за исключением использования их с данными типа datetime, smalldatetimeи sql_variant.
CONVERT Детерминирована, кроме следующих случаев.

Тип источника — sql_variant.

Конечный тип — sql_variant , и его исходный тип недетерминирован.

Исходный или конечный тип — datetime или smalldatetime, другой исходный или конечный тип — строка символов, и задан недетерминированный стиль. Чтобы быть детерминированным, параметр стиля должен быть константой. Кроме того, стили, которые меньше или равны 100, являются недетерминированными, за исключением стилей 20 и 21. Стили более 100 являются детерминированными, за исключением стилей 106, 107, 109 и 113.
CHECKSUM Детерминированный, за исключением контрольных сумм(*).
ISDATE Детерминирована, только если используется с функцией CONVERT, при этом параметр стиля CONVERT задан, но не равен 0, 100, 9 или 109.
RAND Функция RAND детерминирована, только если параметр seed определен.

Все функции конфигурации, курсора, метаданных, безопасности и системные статистические — недетерминированные. Список этих функций можно просмотреть.

Следующие встроенные функции других классов всегда недетерминированы.

  • @@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

Вызов расширенных хранимых процедур из функций

Функции, вызывающие расширенные хранимые процедуры, недетерминированы, так как расширенные хранимые процедуры могут оказать на базу данных побочное действие. Побочные действия — это такое изменение глобального состояния базы данных, как обновление таблицы, внешнего сетевого ресурса или файла. Например, к таким действиям можно отнести изменение файла или отправку сообщения по электронной почте. Не полагаться на возврат согласованного результирующий набор при выполнении расширенной хранимой процедуры из определяемой пользователем функции. Определяемые пользователем функции, которые создают побочные эффекты в базе данных, не рекомендуется.

При вызове изнутри функции расширенная хранимая процедура не может возвращать результирующие наборы клиенту. API-интерфейс любых открытых служб данных, который возвращает результирующие наборы клиенту, имеет код возврата FAIL.

Расширенная хранимая процедура может подключаться к SQL Server. Однако процедура не может присоединиться к той же транзакции, что и исходная функция, которая вызвала расширенную хранимую процедуру.

Как и вызовы из пакета или хранимой процедуры, расширенная хранимая процедура выполняется в контексте учетной записи безопасности Microsoft Windows, в которой выполняется SQL Server. Владелец расширенной хранимой процедуры должен учитывать разрешения в контексте безопасности при предоставлении разрешения на выполнение этой процедуры другим пользователям.

См. также