Что означает «недетерминированные пользовательские функции могут использоваться детерминистическим образом»? - PullRequest
6 голосов
/ 02 апреля 2009

В соответствии со страницей MSDN SQL BOL (Электронная книга) на Детерминированные и недетерминированные функции , недетерминированные функции могут использоваться " детерминированным образом "

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

Что это означает под недетерминированными функциями можно использовать детерминистическим образом ?
Может кто-нибудь проиллюстрировать , как это можно сделать? и где вы бы так сделали?

Ответы [ 4 ]

9 голосов
/ 02 апреля 2009

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

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

Что это означает на практике, зависит от того, что делает функция и как она не является детерминированной.

8 голосов
/ 02 апреля 2009

Пример:

RAND(1)  // deterministic, always returns the same number

против

RAND()   // non-deterministic, returns new random number on each call

Обратите внимание, что в статье MSDN используется определение слова "детерминированный"

5 голосов
/ 02 апреля 2009

BOL фактически заявляет:

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

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

1011 * Е.Г. *

CAST - детерминированный, если не используется с datetime, smalldatetime или sql_variant

Другими словами, вы должны соответствовать этим условиям, чтобы использовать их детерминистическим образом

Например, когда вы создаете таблицу

CREATE TABLE [dbo].[deterministicTest](
    [intDate] [int] NULL,
    [dateDateTime] [datetime] NULL,
    [castIntToDateTime]  AS (CONVERT([datetime],[intDate],0)),
    [castDateTimeToInt]  AS (CONVERT([int],[dateDateTime],0)),
    [castIntToVarchar]  AS (CONVERT([varchar],[intDate],0))
) ON [PRIMARY]

вы можете применить индекс к castIntToVarchar, но если вы попытаетесь добавить индекс в castDateTimeToInt или castIntToDateTime, вы получите следующую ошибку:

Столбец castDateTimeToInt (castIntToDateTime) в таблице dbo.deterministicTest нельзя использовать в индексе, статистике или ключе раздела, поскольку он недетерминирован. Таким образом, dateTime нельзя использовать ни в качестве исходного, ни в качестве целевого формата функции CONVERT, если вы хотите оставаться детерминированным

0 голосов
/ 02 октября 2014

Определения BOL должны читать:

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

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

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

В этом случае недетерминированные функции

a) При каждом вызове возвращать разные значения.

b) Зависит от значений вне строки, к которой они применены.

Примеры группы a): NEWID (), GETDATE (), GETUTDATE (), RAND () без начального числа.

Примеры группы b): GET_TRANSMISSION_STATUS (), LAG (), RANK (), DENSE_RANK (), ROW_NUMBER (), NTILE (), SUM (), если указано с помощью предложений OVER и ORDER BY «

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...