根据确定性和非确定性函数的 MSDN SQL BOL(联机丛书)页面,可以" 以确定的方式 " 使用非确定性函数
以下函数并不总是确定性的,但可以在确定性方式指定时在计算列的索引视图或索引中使用.
非确定性函数的含义可以以确定的方式使用吗?
有人可以说明如何做到这一点?并在那里你会怎么做呢?
函数是确定性的意味着保证始终为相同的输入参数返回相同的输出值.
以确定性方式使用非确定性函数我假设意味着您确保将传递给函数的参数范围使得返回值将是确定性的,即.只依赖那些参数.
这在实践中意味着什么取决于功能的作用以及它以何种方式是非确定性的.
一个例子:
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函数的源也不能用作目标格式