在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章