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
答案 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)