【发布时间】:2020-12-08 05:10:27
【问题描述】:
SQL Server(和其他一些数据库)支持Table-value function。是否存在诸如行值函数之类的东西——基于一组输入值,将返回特定行,或者不支持该类型的函数类型。如果不支持,为什么不支持?
SQL Server 给出的例子是:
CREATE FUNCTION ProductsCostingMoreThan(@cost money)
RETURNS TABLE
AS
RETURN
SELECT ProductID, UnitPrice
FROM Products
WHERE UnitPrice > @cost
所以行值函数可能看起来像(我想):
CREATE FUNCTION GetCalculatedRow(@pk)
RETURNS ROW
AS
RETURN
SELECT * FROM Products
WHERE id=@pk
也许这没有意义(因为很容易有不同的行形状),但我只是好奇这种东西是否受支持?我想它相当于一个相关的子查询,所以它可能有用(或至少方便)。
【问题讨论】:
-
快速回答:没有。为什么?好的,为什么我们需要一个只返回一行的函数,而我们已经有一个可以返回 1 行或更多行的函数。
-
@Ilyes - 我想围绕只允许一行的相关子查询方便?还是表格函数可以做到这一点?
-
@samuelbrody1249,无论它内部的查询返回什么,表函数都可以返回 0、1 或更多行。您可以编写查询
SELECT TOP(1) * FROM Products WHERE id=@pk以保证它不会返回超过 1 行(它仍然可以返回 0 行)。在更广泛的查询中使用这样的函数可能不是很有效。您是否有一些特定的问题要解决,或者只是一般的好奇心?当前的表值函数比“行值函数”更通用,因此很难证明需要此功能。 -
@VladimirBaranov 只是一个普遍的好奇心——如果这是一个“东西”或者它总是由一个表值函数(或其他东西)处理。
-
SQL Server 没有“行值”函数。您有只返回一个值的标量函数或返回具有明确定义的模式和任意数量的行(0 或更多)的表的表值函数。您还可以使用 [相关] 子查询和/或横向连接(SQL Server 中的
CROSS / OUTER APPLY)。
标签: sql sql-server user-defined-functions