tin*_*lyx 11 functions sql-standard
SQL 标准是否定义了具有副作用的函数?
例如,当您执行类似操作时,它们是否具有写入文件* 或更新表某些列中的值的功能
SELECT myfunction(params...);
Run Code Online (Sandbox Code Playgroud)
我有时会看到这些,但我很好奇 SQL 标准是否也这样做。
* 这不是专门针对 PostgreSQL 的问题。我只使用了我在 PostgreSQL 中看到的副作用示例。
Bre*_*zar 18
你在这里有几个不同的问题。
问:什么是 ANSI 标准 SQL 函数?
ANSI 标准函数是诸如 AVG、COUNT、MIN、MAX 之类的东西。它们包含在1992 ANSI 标准中,但这是一本枯燥乏味的读物。
问:ANSI 标准 SQL 函数是否会更改数据库中的数据?
不。您可以使用它们来更改数据 - 例如,我可以说:
INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales
Run Code Online (Sandbox Code Playgroud)
但就其本身而言,仅使用 AVG、COUNT、MIN、MAX 等不应永久更改数据库中的数据。
问:ANSI 标准是否允许我编写自己的函数?
是的,但确切的实施因供应商而异。您编写的函数可能符合 ANSI 语言标准,但是您在函数中所做的事情可能非常糟糕,例如产生副作用。
问:我可以创建自己的函数来写入数据吗?
为什么肯定,如果你有创意。我是 Microsoft SQL Server 专家,所以我将专注于该平台。在线图书的功能页面说:
用户定义的函数不能用于执行修改数据库状态的操作。
我要说的是:
你不是我真正的爸爸。
所以这就是我打破规则的方式。警告:非常糟糕的想法随之而来。
所有这些示例在性能和事务一致性方面都有巨大的缺陷。你只是问理论上是否可以做到,答案是肯定的。我永远不会在自己的代码中使用其中任何一个 - 我会退后一步并问:“我在这里尝试实现的业务目标是什么,有没有办法实现性能和事务一致性?” 如果您想获得有关这些方面的具体建议,我会问一个单独的 Stack 问题,其中包含具体细节。
Mat*_*tum -3
我只能明确地谈论 SQL Server,而且这在所有数据库实现中似乎并不一致。但在 SQL Server 中,函数可能不会产生副作用。这是一条硬性规定,我曾多次试图规避但没有成功。
如果您考虑的是一般意义上的函数,那么有些 SQL 模块允许副作用(例如存储过程),但用户定义的函数则不允许。
有句话说“聪明的解决方案无法扩展”,对于 Microsoft 产品来说尤其如此。我在 SQL Server 的早期版本中看到了许多巧妙的解决方法,但这些方法在后来的版本中已过时,因为 MS 将它们作为真正的功能添加了。
老实说,那些从未成为功能的内容从未成为功能,因为它们从根本上破坏了 T-SQL 开发的某些方面。函数中的副作用就是其中之一。
归档时间: |
|
查看次数: |
2553 次 |
最近记录: |