没有参数的内联表值函数?

Posted

技术标签:

【中文标题】没有参数的内联表值函数?【英文标题】:Inline table valued function without parameters? 【发布时间】:2016-04-08 19:52:31 【问题描述】:

今天我和同事讨论了 SQL Server 中内联表值函数的使用,为什么我推荐使用它们以及它们在哪些场景中有用。

我突然想到,它们不必有任何输入参数,但我想不出什么情况下你会想要这样做,而且它比视图有任何好处,有什么好处吗?

【问题讨论】:

一个重要的区别是您始终可以向表值函数添加默认参数。此外,计划的缓存方式可能​​存在细微差别。如果我没记错的话,视图是在第一次执行时编译的,但表值函数是在编译调用它们的查询时编译的(并且计划可能与查询一起缓存)。但是,这可能有点偏离。 我想不出来,我强烈支持这种情况下的观点,因为内联表值函数更复杂,需要更多资源 @user3481891 你能解释一下为什么 itvf 更复杂吗?为什么你说他们需要更多的资源?他们需要什么资源?我很好奇这两种说法背后的事实。 当然。一个 itvf 需要更多的结构来容纳参数。更多的结构是更复杂的。更高的复杂性意味着更多的内存、CPU 和磁盘空间。定义不带参数的 itvf 可能只是简单地向 SQL Server 发出信号,将其编译为视图,在这种情况下,仅在编译时使用额外的资源。额外的复杂性将只是一个额外的指针的问题,但在 itvf 中涉及的资源和复杂性总是比视图多。它适用于何处取决于 MS 在何处实现它。如果你只需要一个视图,只定义一个视图。 【参考方案1】:

确实应该没有理由不希望将数据放在表格中或查看某处...除非您想要一些 magic 值或其他可以仅对您的应用程序可用,并且您可能正在加密该函数?

查看Encrypting and Decrypting SQL Server Stored Procedures, Views and User-Defined Functions 以获取此类示例*。这是一个示例,归根结底,它实际上是一个非常好的示例。

(尽管请不要使用 SHA2_256 加密您的密码 - 使用没有已知漏洞的东西)

【讨论】:

你可以加密视图和函数 True - 但函数可以执行操作 - 输入/输出 - 视图不能执行的操作。请注意,我并不是说这是一个好主意,但我可以看到在函数中硬编码变量的倾向,然后加密这些函数以混淆脚本的内部工作 - 另外,作为函数,他们不必在某个表的某个地方对数据进行操作。 但是 OP 询问的是使用 没有 输入的函数,并且视图和函数都没有输出参数。硬编码的值也适用于视图。事实上,如果你不使用参数,你会在同一个地方定义它们。 我可以看到你要去哪里。 OTOH:对我来说,硬编码值似乎更多地出现在存储过程或函数中,而不是最终出现在视图中。也许这是一个偏好问题?我不知道——我发现了唯一一个中规中矩的例子,而且它似乎有点道理——无论如何我都不能看到自己这样做。

以上是关于没有参数的内联表值函数?的主要内容,如果未能解决你的问题,请参考以下文章

sql中的表值函数与标量值函数区别与用法

SQL 自定义函数(Function)——参数默认值

sqlserver中的表值函数和标量值函数

SQL Server 自定义函数(Function)——参数默认值

SQL Server 自定义函数(Function)——参数默认值

sql2005中 表值函数是啥