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

Изменения: 17 июля 2006 г.

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

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

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

Детерминизм встроенных функций

На детерминизм встроенных функций повлиять нельзя. Каждая из них детерминирована или недетерминирована в зависимости от реализации в Microsoft SQL Server 2005.

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

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

ABS

DATEDIFF

PARSENAME

ACOS

DAY

POWER

ASIN

DEGREES

RADIANS

ATAN

EXP

ROUND

ATN2

FLOOR

SIGN

CEILING

ISNULL

SIN

COALESCE

ISNUMERIC

SQUARE

COS

LOG

SQRT

COT

LOG10

TAN

DATALENGTH

MONTH

YEAR

DATEADD

NULLIF

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

Функция Комментарии

CAST

Детерминирована, кроме случаев использования с datetime, smalldatetime или sql_variant.

CONVERT

Детерминирована, кроме следующих случаев.

  • Исходный тип — sql_variant.
  • Конечный тип — sql_variant, и его исходный тип недетерминирован.
  • Исходный или конечный тип — datetime или smalldatetime, другой исходный или конечный тип — строка символов и задан недетерминированный стиль. Чтобы быть детерминированным, параметр стиля должен быть константой. Кроме того, стили, меньшие или равные 100, являются недетерминированными, за исключением стилей 20 и 21. Стили больше 100 являются детерминированными, за исключением стилей 106, 107, 109 и 113.

CHECKSUM

Детерминирована, за исключением CHECKSUM(*).

ISDATE

Детерминирована, только если используется с функцией CONVERT, при этом аргумент стиля CONVERT задан, но не равен 0, 100, 9 или 109.

RAND

Функция RAND детерминирована, только если аргумент seed определен.

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

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

@@CONNECTIONS

@@TOTAL_READ

@@CPU_BUSY

@@TOTAL_WRITE

@@DBTS

CURRENT_TIMESTAMP

@@IDLE

GETDATE

@@IO_BUSY

GETUTCDATE

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSION

@@PACK_SENT

NEWID

@@PACKET_ERRORS

NEWSEQUENTIALID

@@TIMETICKS

RAND

@@TOTAL_ERRORS

TEXTPTR

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

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

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

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

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

См. также

Основные понятия

Правила написания пользовательских функций
Возвращающие табличное значение пользовательские функции
Определяемые пользователем встроенные функции
Преобразование хранимых процедур в функции

Другие ресурсы

Проектирование пользовательских функций

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал
Изменения
  • Добавлены сведения к описанию функции CONVERT, разъясняющие, что использование CONVERT приводит к детерминированным результатам, если исходный или конечный тип — не datetime или smalldatetime, другой исходный или конечный тип — строка символов и задан недетерминированный стиль.
  • Также разъяснено, какие стили являются детерминированными и недетерминированными.