T-SQL用户定义函数重载?

Nic*_*ick 25 sql t-sql sql-server sql-server-2005

我知道T-SQL不是面向对象的.我需要编写一组模拟C#中方法重载的函数.

是否在T-SQL中以任何方式支持函数重载?如果有黑客这样做,建议吗?

Joh*_*ers 11

不,没有办法做到这一点.

我建议你重新审视这个要求,因为"让苹果看起来像橙子"通常很难做到,而且值得怀疑.

  • 这不是"让苹果看起来像橙子",函数重载是对不同数据类型执行类似操作的问题的常见和优雅的解决方案.这样的耻辱T-SQL不支持它:( (33认同)
  • 这是旧文章,但我仍然认为添加评论合适。SQL Server正在做重载(!),例如CONCAT(<文本>,<文本>),CONCAT(<文本>,<数字>),CONCAT(<文本>,<日期>)。现在,@ JohnSaunders,考虑一个函数,该函数将返回值列表的最高值(例如在ORACLE的GREATEST函数中)。您可以提供4个数字或5个日期或6个字符串给相同的函数名称。甚至最基本的,都考虑接受整数,浮点数,字符串等的“ +”运算符。因此,函数重载在OO发明者诞生之前就已经存在。 (3认同)
  • 我认为这里的问题是CONCAT()是一个变量参数函数,UDF不允许你创建它.类似地,CONVERT()具有2个参数和3个参数版本.UDF也不允许这样做.SQL Server当然支持这种类型的功能.你不能自己做一个. (3认同)

ben*_*ers 8

我成功完成的一件事是以允许它处理空值的方式编写函数,然后使用null来调用它来代替您想要省略的参数.

例:

create function ActiveUsers
(
    @departmentId int,
    @programId int
)
returns int
as
begin
    declare @count int

    select @count = count(*)
    from users
    where
        departmentId = isnull(@departmentId, departmentId)
        and programId = isnull(@programId, programId)

    return @count
end
go
Run Code Online (Sandbox Code Playgroud)

用途:

select ActiveUsers(1,3) -- users in department 1 and program 3
select ActiveUsers(null,3) -- all users in program 3, regardless of department
select ActiveUsers(null,null) -- all users
Run Code Online (Sandbox Code Playgroud)


Jer*_*yth 5

你可以传入一个sql_variant,但它附带了各种各样的危险; 您不能像使用OO语言和重载一样使用强类型.

如果需要在函数中找到基本类型,可以使用该SQL_VARIANT_PROPERTY函数.