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

发布于 2024-07-16 21:53:36 字数 358 浏览 11 评论 0原文

根据 MSDN SQL BOL(联机丛书)页面 确定性和非确定性函数 ,非确定性函数可以“以确定性方式使用”

以下函数并不总是确定性的,但当以确定性方式指定时,可以在索引视图或计算列上的索引中使用它们。

可以以确定性方式使用非确定性函数是什么意思?
有人可以说明如何可以做到这一点吗? 您会在哪里这样做?

According to MSDN SQL BOL (Books Online) page on Deterministic and Nondeterministic Functions, non-deterministic functions can be used "in a deterministic manner"

The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

What does it mean by non-deterministic functions can be used in a deterministic manner?
Can someone illustrate how that can be done? and where you would do so?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

感性不性感 2024-07-23 21:53:36

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

我认为以确定性方式使用非确定性函数意味着您确保传递给函数的参数范围使得返回值是确定性的,即。 仅依赖于这些论点。

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

That a function is deterministic means that it is guaranteed always to return the same output value for the same input arguments.

Using a non-deterministic function in a deterministic manner I assume means that you ensure that the range of arguments you will pass to the function is such that the return value will be deterministic, ie. dependent only opon those arguments.

What this implies in practice depends on what the function does and in what way it is non-deterministic.

笑红尘 2024-07-23 21:53:36

示例:

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

对比:

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

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

An example:

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

versus:

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

Note this uses the MSDN article's definition of the word "deterministic"

孤千羽 2024-07-23 21:53:36

BOL 实际上规定:

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


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

例如

CAST - 确定性除非与
日期时间、小日期时间或
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.definisticTest' 中的列 'castDateTimeToInt'(castIntToDateTime) 不能用于索引或统计信息或作为分区键,因为它是非确定性的。

出现 如果您想保持确定性,则既不用作 CONVERT 函数的源格式也不用作目标格式

the BOL actually states:

The following functions are not
always deterministic
, but can be
used in indexed views or indexes on
computed columns when they are
specified in a deterministic manner.

and then below it states what conditions must be met to make them deterministic.

E.g.

CAST - Deterministic unless used with
datetime, smalldatetime, or
sql_variant

In other words you need to meet those condition to use them in deterministic manner

For example when you create a table

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]

you can apply index on castIntToVarchar but if you try to add index to castDateTimeToInt or castIntToDateTime you will get the following error:

Column 'castDateTimeToInt'(castIntToDateTime) in table 'dbo.deterministicTest' cannot be used in an index or statistics or as a partition key because it is non-deterministic.

So the dateTime cannot be used neither as a source nor the target format of the CONVERT function if you want to stay deterministic

非要怀念 2024-07-23 21:53:36

BOL 定义应为:

“每当使用一组特定的输入值(行)调用确定性函数并给定相同的数据库状态时,确定性函数总是在同一行上返回相同的结果。

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

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

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

a) 每次调用时返回不同的值。

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

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

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

请注意,一些作者使用确定性函数的不同定义 这可能会导致混乱。

BOL definitions should read:

”Deterministic functions always return the same result on the same row any time they are called with a specific set of input values (row) and given the same state of the database.

In other words deterministic functions always return the same result on any particular fixed value from their domain (in this case domain is a row).

Nondeterministic functions may return different results each time they are called with a specific set of input values (row) even if the database state that they access remains the same.

In this case nondeterministic functions

a) Return different values every time they called.

b) Depend on the values outside of the row they applied on.

Examples of group a): NEWID(), GETDATE(), GETUTDATE(), RAND() with no seed specified.

Examples of group b): GET_TRANSMISSION_STATUS(), LAG(), RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE(), SUM() when specified with the OVER and ORDER BY clauses.

Please note that some authors use different definition of deterministic functions which may lead to confusion.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文