Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Детерминированные функции всегда возвращают один и тот же результат при вызове с определенным набором входных значений и с тем же состоянием базы данных. Недетерминированные функции могут возвращать разные результаты каждый раз, когда они вызываются с определенным набором входных значений, даже если состояние базы данных, к которому они обращаются, остается неизменным. Например, функция 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. Владелец расширенной хранимой процедуры должен учитывать это при предоставлении разрешений другим пользователям для выполнения процедуры.