2013-09-24 32 views
2

合并似乎适用于任何数量的参数并返回第一个非空值。我怎样才能写出这样的功能?一个没有固定数量的参数?如何在SQL Server中编写任意数量的参数函数

功能的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

只是使用coalesce? –

+0

你不能在T-SQL中编写一个。我认为如果你编写一个扩展存储过程(例如C语言),你可以接受未知数量的参数,但是对该功能的支持将来会消失,并且它们与函数不同(它们不能被编写成一个更大的查询) –

+2

你能展示一个你试图实现的样本吗?因为聚结应该尽可能地从你的问题中读取? – Tanner

回答

0

不幸的是,在试过之后,我确信您不能在T-SQL中自己编写COALESCE类似的函数。

我敢肯定,你可以用所谓的CLR-Functions,你可以在C#例如代码,以弥补SQL-Server中的某些功能缺失。 但是我不得不同意下面的评论,这并不解释你需要在sql中提供参数列表来介绍你仍然会有这种限制的新函数。

因此,简而言之,您无法自行为T-SQL编写这些函数。

+0

但是,由于在导入CLR UDF时必须提供参数列表,因此不能组合这两个概念。 –

+0

哦,真的?我正准备自己尝试一下,这是一个沮丧。我将完成我的尝试,然后回来编辑/删除它,所以看起来没有可能实现OP想要的内容;/ – DrCopyPaste

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) 
+0

这种方法看起来很有前途,但SQL Server Management Studio抱怨如果我只给它有三个参数,即使@ Value4的默认值为空。 – Kristoffer

+0

请参阅编辑 - 结果可选值在UDF中被忽略...... :( –

相关问题