【问题标题】:In TSQL can I create a UDF which has as input a table's row?在 TSQL 中,我可以创建一个以表行作为输入的 UDF 吗?
【发布时间】: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。

标签: sql-server tsql user-defined-functions


【解决方案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
    

    【讨论】:

    • 非常好 - 这看起来是我需要的最佳方法
    • 最好使用视图来获取计算列 - 当有人编写插入/更新语句时会导致问题,不知道全名列是什么。
    • 视图显然也是一个答案,但我不同意计算列会引起混淆。
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多