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

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

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

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

Встроенный детерминизм функции

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

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

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

АБС DATEDIFF СИЛА
АКОС ДЕНЬ РАДИАНЫ
ASIN (Уникальный идентификатор товара на Amazon) ГРАДУСЫ КРУГЛЫЙ
АТАН ОПЫТ ЗНАК
ATN2 ЭТАЖ ГРЕХ
ПОТОЛОК ISNULL (проверка на отсутствие значения) ПЛОЩАДЬ
ОБЪЕДИНЯТЬСЯ ISNUMERIC SQRT
Кос ЛОГ ЗАГАР
ДЕТСКАЯ КРОВАТКА LOG10 ГОД
ДлинаДанных МЕСЯЦ
DATEADD NULLIF (SQL-функция, использующаяся для сравнения двух выражений).

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

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

Исходный тип : sql_variant.

Целевой тип — это sql_variant и его исходный тип недетерминирован.

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

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

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

@@СВЯЗИ GETDATE
@@ПРОЦЕССОР_ЗАНЯТ GETUTCDATE
@@DBTS ПОЛУЧИТЬ_СТАТУС_ПЕРЕДАЧИ
@@IDLE ОТСТАВАНИЕ
@@IO_BUSY ПОСЛЕДНЕЕ_ЗНАЧЕНИЕ
@@MAX_CONNECTIONS ЛИДЕРСТВО
@@ПОСЫЛКА_ПОЛУЧЕНА MIN_ACTIVE_ROWVERSION
@@PACK_SENT НОВЫЙ ID
Ошибки пакетов NEWSEQUENTIALID
@@TIMETICKS СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ
@@ОБЩЕЕ_КОЛИЧЕСТВО_ОШИБОК NTILE
ВСЕГО ПРОЧИТАНО ПАРСНЕЙМ
@@ОБЩИЙ_ЗАПИСЬ PERCENTILE_CONT (перцентильный континуум)
CUME_DIST ПЕРЦЕНТИЛЬ_ДИСК (PERCENTILE_DISC)
CURRENT_TIMESTAMP РАНГ_В_ПРОЦЕНТАХ
DENSE_RANK РАНД
ПЕРВОЕ_ЗНАЧЕНИЕ РАНГ
НОМЕР_СТРОКИ
TEXTPTR

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

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

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

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

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