Cześć, mam funkcje, w której mam 3 zmienne: @r1, @R2, @r3.
Czy MSSQL ma jakieś wbudowane funkcje, które zwrócą mi największą wartość, czy muszę robić to sam?
Raczej nic gotowego nie ma, MAX działa tylko dla danych z tabel.
Na upartego można zrobić coś takiego:
create function dbo.moja_funkcja
(
@a1 int,
@a2 int,
@a3 int
)
returns int
begin
declare @t table (a int)
insert into @t values (@a1), (@a2), (@a3)
return (select max(a) from @t)
end
go
select dbo.moja_funkcja(1,2,3)
albo:
create function dbo.moja_funkcja
(
@a1 int,
@a2 int,
@a3 int
)
returns @t table (a int)
begin
insert into @t values (@a1), (@a2), (@a3)
return
end
go
select max(a) from dbo.moja_funkcja(1,2,3)
Do samego wyliczenia wartości możesz skorzystać z kodu pierwszej funkcji i oczywiście zwracać coś zupełnie innego...
A takie cos by nie poszlo? Nie mam pod reka serwera to nie sprawdze.
select max(val) from (select @1 val union select @2 val union select @3 val)Q
Poszło i nawet działa :)
somekind napisał(a)
Poszło i nawet działa :)
A ktoś może mi powiedzieć, czy będzie szybsze rozwiązanie Johnniego, czy zwykłe ify?
Raczej ify. Dla pesymistycznego przypadku wystarczy chyba tylko 3 porownania przejsc w sciezce. Moje pewnie bedzie szybsze do inserta.
Najszybsza będzie oczywiście wersja z if-ami. Sporo wolniejsza będzie wersja z unionami, a zdecydowanie najwolniejsza wersja z tabelką małpkową. Oczywiście przy trzech intach te różnice będą rzędu kilkunastu milisekund ale warto wiedzieć na przyszłość przy okazji implementacji czegoś większego.
Insert z wstawianymi wartościami po przecinku będzie chodził tylko na 2008. W 2005 trzeba dać trzy inserty albo insert z selecta z unionami.