在 TSQL 中,我可以创建一个以表行作为输入的 UDF 吗?

Posted

技术标签:

【中文标题】在 TSQL 中,我可以创建一个以表行作为输入的 UDF 吗?【英文标题】:In TSQL can I create a UDF which has as input a table's row? 【发布时间】:2009-11-24 15:40:33 【问题描述】:

我正在寻找创建我认为简单的东西。

我想要一个用户定义的函数,它从表中获取一行作为输入并返回一个标量值。

类似

select 
    mt.Id,
    MyUDF(mt)
from M
    MyTable mt
where mt.Price > 0

我知道我可以将 Id 传递给 UDF,然后从 UDF 中查找值,但这似乎需要做很多额外的工作。

【问题讨论】:

听起来像 JOIN 标准。根据您打算在 UDF 中执行的操作,您可能根本不需要 UDF。 【参考方案1】:

不,RDBMS 没有作为一个整体的行的概念——只有字段的元组。您需要单独发送各个字段,或者发送可在 UDF 中使用的 ID 以从该行检索必要的字段。

【讨论】:

【参考方案2】:

正如 marc_s 所说,在 T-SQL 中不存在将“行”作为对象发送的想法。您可以将行中的数据作为单独的值发送,但不能作为行本身发送。

桌子上的computed column 可能更有意义。如果值直接依赖于行​​中存在的值(并且依赖于任何外部值),那么这将是一个解决方案。

例如,假设我有这张桌子:

Customer:
    CustomerID
    FirstName
    LastName
    ...

如果我想要 FullName 的计算列,我的表声明将如下所示:

create table Customer
(
    CustomerID int identity(1, 1) primary key,
    FirstName varchar(100),
    LastName varchar(100),
    FullName as LastName + ', ' + FirstName
)

我也可以在事后使用ALTER 声明添加它

alter table Customer add FullName as LastName + ', ' + FirstName

【讨论】:

非常好 - 这看起来是我需要的最佳方法 最好使用视图来获取计算列 - 当有人编写插入/更新语句时会导致问题,不知道全名列是什么。 视图显然也是一个答案,但我不同意计算列会引起混淆。

以上是关于在 TSQL 中,我可以创建一个以表行作为输入的 UDF 吗?的主要内容,如果未能解决你的问题,请参考以下文章

教义 - 以表为目标的多对多

更新脚本以针对具有递增 ID 的新创建的表行运行

在 TSQL 中重新创建 s-s-rS 数据源以进行测试

以表为输入参​​数的 Oracle 函数

自动为 Mysql 表行生成页面

如何将表行传递给 plpgsql 函数?