如何在SQL Server中编写任意数量的参数函数

时间:2013-09-24 10:17:18

标签: sql-server tsql sql-function

Coalesce似乎可以使用任意数量的参数并返回第一个非空的参数。我该怎么写这样的函数?一个没有固定数量的参数?

使用函数fMax的一个例子:

select Length = dbo.fMax(box.Height, box.Width, box.Depth)
from dbo.tBox box
where box.ShipmentId = 1234

有了这样的功能,我就不用写这样的东西了:

select Length = (
   select MAX(side)
   from (values (box.Height), (box.Width), (box.Depth)) as sides(side))
from dbo.tBox box
where box.ShipmentId = 1234

3 个答案:

答案 0 :(得分:2)

如果您使用SQL Server 2008及更高版本,则可以使用Table-Valued Parameters

答案 1 :(得分:0)

不幸的是,在尝试完之后,我很确定你不能在COALESCE中自己编写T-SQL - 类似函数。

我非常确定你可以使用所谓的CLR-Functions,你可以在C#编写代码来弥补SQL-Server中一些缺乏的功能。 但是我必须同意下面的评论,这并不能解除你在sql中提供参数列表的需要,以引入你仍然会受到限制的新函数。

简而言之,您不能自己为T-SQL编写此类函数。

答案 2 :(得分:0)

正如其他回应者所说,我认为你不能完全按照你的要求行事。

但是我认为您可以使用默认参数进行合理的近似。如果你知道一个合理的上限,你可以定义一个这样的函数:

- 编辑

原来你不能在UDF上拥有默认值。或者您可以定义它们,但是在调用函数时仍需要指定值

这意味着你能做的最好的事情就是拥有最大数量的参数:

CREATE FUNCTION dbo.fMax
(
    @Value1 float,
    @Value2 float,
    @Value3 float,
    @Value4 float
)
RETURNS float
AS
BEGIN
  DECLARE @Result float

  SELECT @Value1 = COALESCE(@Value1, @Value2, @Value3, @Value4)
  SELECT @Value2 = COALESCE(@Value2, @Value1, @Value3, @Value4)
  SELECT @Value3 = COALESCE(@Value3, @Value1, @Value2, @Value4)
  SELECT @Value4 = COALESCE(@Value4, @Value1, @Value2, @Value3)

  SELECT @Result = @Value1

  IF (@Value2 > @Result)
    SELECT @Result = @Value2

  IF (@Value3 > @Result)
    SELECT @Result = @Value3

  IF (@Value4 > @Result)
    SELECT @Result = @Value4

  RETURN @Result
END

并将其称为:

SELECT dbo.fMax(1, 5, 4, null)