我是使用函数的新手,在我看来,内联函数与视图非常相似。我是对的吗?
另外,我可以在函数中使用UPDATE语句吗?
答案 0 :(得分:16)
在阅读了这里的许多答案之后,我想指出一个内联表值函数和任何其他类型的函数(标量或多行TVF)之间存在很大差异。
内联TVF只是一个参数化视图。它可以像视图一样进行扩展和优化。在“返回结果”或类似之前不需要实现任何内容(尽管不幸的是,语法有RETURN
。
我发现内联TVF对视图的一个很大的好处是它确实强制要求参数化,而对于视图,你必须假设调用者将适当地加入或限制视图的使用。
例如,我们在DW中有许多大型事实表,其中包含典型的Kimball星型模型。我有一个以事实为中心的模型的视图,它没有任何限制地调用,将返回数亿行。通过使用具有适当参数化的内联TVF,用户无法意外地询问所有行。两者之间的表现在很大程度上难以区分。
答案 1 :(得分:3)
没有区别。它们都被扩展/取消内容放入包含的查询中。
注意:索引视图被视为不同,但仍可以展开,多值表函数是包含查询的黑盒子。
Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post
最后,函数
中不允许写入表编辑,在Eric Z Beard的评论和downvote之后...
问题和答案(不仅仅是我的)不是关于标量udfs。 “内联”表示“内联表值函数”。非常不同的概念......
答案 2 :(得分:2)
更新:看起来我错过了“内联”部分。但是,我在这里留下答案,以防有人想要阅读VIEW和常规功能之间的区别。
如果您只有一个执行SELECT并输出数据的函数,那么它们是相似的。然而,即使这样,它们也不一样,因为引擎可以优化VIEW。例如,如果运行SELECT * FROM view1 WHERE x = 10;并且您在映射到X的表字段上有索引,然后将使用它。另一方面,函数在搜索之前构建结果集,因此您必须在其中移动WHERE - 但是,这并不容易,因为您可能有许多列,并且您不能在同一个select语句中对所有这些列进行ORDER BY。
因此,如果比较视图和函数来完成对数据提供“视图”的相同任务,那么VIEW是更好的选择。
但是,功能可以做得更多。您可以执行多个查询,而无需使用JOINS或UNION连接表。您可以对结果执行一些复杂的计算,运行其他查询并将数据输出给用户。函数更像是能够返回数据集的存储过程,然后它们就像视图一样。
答案 3 :(得分:2)
似乎没有人提到过这个方面。
您无法在内联函数中使用Update
语句,但您可以将Update
语句写入,就好像它们是可更新的视图。
答案 4 :(得分:1)
一个很大的区别是函数可以获取参数,而VIEW则不能。
我倾向于赞成VIEW,它是标准的,因此也是便携式实现。如果没有WHERE子句,等效的VIEW没有意义,我会使用函数。
例如,我有一个查询相对较大的有效时间状态表('history'表)的函数。如果这是一个VIEW并且您试图在没有WHERE子句的情况下查询它,那么您将获得大量公平的数据(最终!)使用函数建立合同,如果您需要数据,则必须提供客户ID,开始日期和结束日期,功能是我建立这种联系的方式。为什么不存储过程?好吧,我希望用户想要将结果集加入到更多数据(表,VIEW,函数等)中,而函数是IMO最好的方法,比如说,要求用户将结果集写入临时表
答案 5 :(得分:1)
回答有关函数更新的问题(msdn):
唯一可以做出的改变 函数中的语句是 更改到本地对象 功能,如本地游标或 变量。对数据库的修改 表,对游标的操作 不是本地的功能,发送 电子邮件,尝试目录 修改,并生成结果 返回给用户的set 不能采取的行动的例子 在一个函数中执行。
答案 6 :(得分:0)
视图是从查询返回的数据的“视图”,几乎是伪表。函数返回通常从查询数据派生的值/表。如果函数最终返回值/表,则可以在函数中运行任何sql语句。
答案 7 :(得分:0)
一个函数允许您传入参数以创建更具体的视图。假设您希望根据州获取客户。一个函数可以让你传递你正在寻找的状态,并在那个状态下给你所有的客户。视图无法做到这一点。
答案 8 :(得分:-1)
一个函数执行任务或许多任务。视图通过查询检索数据。什么适合该查询也是你有限的。在一个函数中,我可以更新,选择,创建表变量,删除一些数据,发送电子邮件,与我创建的CLR交互等等。比低视图更强大!