“非确定性用户定义函数可以以确定的方式使用”是什么意思?

时间:2009-04-02 12:59:45

标签: sql sql-server user-defined-functions deterministic non-deterministic

根据Deterministic and Nondeterministic Functions上的MSDN SQL BOL(联机丛书)页面,非确定性函数可以“以确定的方式使用

  

以下函数并非总是具有确定性,但在以确定性方式指定时,可以在计算列的索引视图或索引中使用。

非确定性函数的含义可以以确定的方式使用
有人可以说明可以做的如何吗? 哪里你会这样做?

4 个答案:

答案 0 :(得分:8)

函数是确定性的意味着保证始终为相同的输入参数返回相同的输出值。

以确定性方式使用非确定性函数我假设意味着您确保将传递给函数的参数范围使得返回值将是确定性的,即。只依赖那些论点。

这在实践中意味着什么取决于功能的作用以及它以何种方式是非确定性的。

答案 1 :(得分:8)

一个例子:

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

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

请注意,这使用了MSDN文章对“deterministic”一词的定义

答案 2 :(得分:5)

BOL实际上说:

  

以下功能不是   总是确定性的,但可以   用于索引视图或索引   它们的计算列   以确定的方式指定。

然后在下面说明必须满足哪些条件才能使它们具有确定性。

E.g。

  

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函数的源也不能用作目标格式

答案 3 :(得分:0)

BOL定义应为:

“确定性函数在使用一组特定的输入值(行)调用它们并且给定相同的数据库状态时,始终在同一行返回相同的结果。

换句话说,确定性函数总是在其域中的任何特定固定值上返回相同的结果(在这种情况下,域是一行)。

非确定性函数每次使用一组特定的输入值(行)调用时都可能返回不同的结果,即使它们访问的数据库状态保持不变也是如此。

在这种情况下,非确定性函数

a)每次打电话都会返回不同的值。

b)取决于他们所应用的行之外的值。

组a)的示例:NEWID(),GETDATE(),GETUTDATE(),RAND(),未指定种子。

组b)的示例:当使用OVER和ORDER BY子句指定时,GET_TRANSMISSION_STATUS(),LAG(),RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE(),SUM()。 “

请注意some authors use different definition of deterministic functions可能导致混淆。