根据 MSDN SQL BOL (Books Online) page on Deterministic and Nondeterministic Functions,非确定性函数可以“以确定的方式”使用
以下函数并不总是确定性的,但当它们以确定性方式指定时,可用于索引视图或计算列的索引。
非确定性函数可以以确定性方式使用是什么意思?
有人可以说明如何做到这一点吗?你会在哪里这样做?
根据 MSDN SQL BOL (Books Online) page on Deterministic and Nondeterministic Functions,非确定性函数可以“以确定的方式”使用
以下函数并不总是确定性的,但当它们以确定性方式指定时,可用于索引视图或计算列的索引。
非确定性函数可以以确定性方式使用是什么意思?
有人可以说明如何做到这一点吗?你会在哪里这样做?
一个函数是确定性的意味着它保证总是为相同的输入参数返回相同的输出值。
我假设以确定性方式使用非确定性函数意味着您确保将传递给函数的参数范围使得返回值是确定性的,即。仅依赖于这些论点。
这在实践中意味着什么取决于函数做什么以及它以何种方式是不确定的。
一个例子:
RAND(1) // deterministic, always returns the same number
相对:
RAND() // non-deterministic, returns new random number on each call
请注意,这使用了 MSDN 文章对“确定性”一词的定义
BOL 实际上指出:
以下函数并不总是确定性的,但可以在以确定性方式指定的索引视图或计算列的索引中使用。
然后在下面说明必须满足哪些条件才能使它们具有确定性。
例如
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 您将收到以下错误:
表 'dbo.deterministicTest' 中的列 'castDateTimeToInt'(castIntToDateTime) 不能用于索引或统计信息或用作分区键,因为它是不确定的。
因此,如果您想保持确定性,dateTime 既不能用作 CONVERT 函数的源格式,也不能用作目标格式
BOL 定义应为:
”确定性函数在使用一组特定的输入值(行)调用并给定相同的数据库状态时,总是在同一行上返回相同的结果。
换句话说,确定性函数总是在其域中的任何特定固定值上返回相同的结果(在这种情况下,域是一行)。
每次使用一组特定的输入值(行)调用非确定性函数时,即使它们访问的数据库状态保持不变,它们也可能返回不同的结果。
在这种情况下,非确定性函数
a) 每次调用时返回不同的值。
b)取决于它们应用的行之外的值。
a) 组示例:未指定种子的 NEWID()、GETDATE()、GETUTDATE()、RAND()。
b) 组的示例:使用 OVER 和 ORDER BY 子句指定时,GET_TRANSMISSION_STATUS()、LAG()、RANK()、DENSE_RANK()、ROW_NUMBER()、NTILE()、SUM()。”</p>
请注意,一些作者使用了不同的确定性函数定义,这可能会导致混淆。