2

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
4

3 回答 3

2

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

于 2013-09-24T10:27:16.843 回答
0

不幸的是,在尝试了之后,我很确定你COALESCE不能自己在T-SQL.

我很确定您可以使用所谓CLR-Functions的代码C#来弥补 SQL-Server 中缺少的一些功能。但是我必须同意下面的评论,这并不能免除您在 sql 中提供参数列表以引入您仍然会有该限制的新功能的需要。

所以简而言之,你不能自己为 T-SQL 编写这样的函数。

于 2013-09-24T10:27:38.443 回答
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)
于 2013-09-24T14:28:36.090 回答