views:

1524

answers:

4

In Excel, there's a function called "MAX" that accepts numbers and returns the largest one in the set. Is there a function in T-SQL that duplicates this functionality? I haven't been able to find one, and I've written a UDF that does it for me, but I thought it was worth asking.

Here is the function I've been using:

CREATE FUNCTION dbo.LargerOf
(
    -- Add the parameters for the function here
    @First FLOAT,
    @Second FLOAT
)
RETURNS FLOAT
AS
BEGIN

    DECLARE @Result FLOAT

    IF @First > @Second
     SET @result = @First
    ELSE
     SET @Result = @Second

    RETURN @Result

END
GO

I don't expect any luck, but instead of moving my function to a whole bunch of new servers, I thought I'd at least ask. Thanks!

+5  A: 

I don't know if the function you need exists, but for a workaround, I like this one better

set @max = case when @first > @second then @first else @second end
tekBlues
At first I was doing this, but then I got tired of typing it out (since I had to use it constantly) and decided to essentially wrap it in a UDF, which is the code I've given above. Thanks for the suggestion, though!
rwmnau
It will make a smaller UDF anyway :-)
tekBlues
Be careful with using a UDF for this. Sometimes simply encapsulating code in a UDF will cause performance issues because SQL Server has to act on the resultset on a row-by-row basis, whereas built-in functions can usually be used on a set-based basis.
Tom H.
@TomH - Good point. This can be mitigated by using a table-valued function though.
Aaron Alton
@TomH - this is not a problem so long as the UDF is deterministic, as this one is.
Tor Haugen
+2  A: 

You could use:

CASE
   WHEN @First >= @Second THEN @FIRST
   ELSE @Second
END
Tor Haugen
+1  A: 

Unfortunately not.

A word of warning, for extremely intensive usage, I've found that scalar functions (even those which could be easily inlined with a CASE, like yours) really do not perform well on SQL Server 2005, so if you are dealing with millions of calls, put it inline (sometimes you can fake an inline TVF).

Hopefully, SQL Server will eventually have an inline SVF or have a function equivalent to GREATEST!

Cade Roux
+1  A: 

declare @first int, @second int

select @first=45, @second=123

select max(a) from (select @first a UNION ALL select @second) x

msi77