Benutzerdefinierte Funktionen
Mit benutzerdefinierte Funktionen kann der Datenbankentwickler die Funktionalität von TSQL erweitern. Es gibt drei Typen von benutzerdefinierten Funktionen:
- Skalarfunktionen
- Tabellenwertfunktionen
- Aggregatfunktionen
Skalarfunktionen
Liefern einen Skalaren Wert zurück. Können in Ausdrücken unbeschränkt eingesetzt werden.
Eine besonders einfache Funktion liefert nur eine Konstante: die Erdmasse in Kg. Die Funktion ist Parameterlos
CREATE FUNCTION [dbo].[Erdmasse] () RETURNS float AS BEGIN -- Declare the return variable here DECLARE @EM float -- Add the T-SQL statements to compute the return value here SELECT @EM = [Masse_in_kg] from [dbo].[HimmelskoerperTab] where [Name] = 'Erde' -- Return the result of the function RETURN @EM END -- Test select masse_in_kg / dbo.Erdmasse() as Jupitermasse_in_Erdmassen from dbo.HimmelskoerperTab where name = 'Jupiter'
Die Folgende Funktion rechnet den Speicherbedarf von Byte in Kilobyte um. Dazu hat sie einen Parameter.
use dmsmin
go
CREATE FUNCTION data.InKB
(
-- Add the parameters for the function here
@valueInByte int
)
RETURNS float
AS
BEGIN
-- Return the result of the function
RETURN @valueInByte / 1024.0
END
GO
-- Test
Select ext, sum(SizeInBytes) as InBytes, data.InKB(sum(SizeInBytes)) as InKB
from data.FileInfos
group by ext
go
Tabellenwertfunktionen
Liefern eine Tabelle als Wert zurück. Können in einem Select Befehl überall dort eingesetzt werden, wo auch Subselects zulässig sind:
create function dbo.Trabanten_von( @Zentralkoerpername as nvarchar(1000))
returns table
as return (
-- (c) Martin Korneffel, Stuttgart 2015
-- Erzeugt eine View mit denromalisierter Darstellung der Umlaufbahnen
-- Abruf aller Trabanten
select Z.ID as ZentralID, Z.Name as Zentralkoerper, ZY.Name as ZentralkoerperTyp, ZY.ID as ZentralkoerperTypId, Z.Masse_in_kg as Zentralmasse,
T.ID as TrabantID, T.Name as Trabant, TY.Name as TrabantTyp, TY.ID as TrabantTypId, T.Masse_in_kg as Trabantmasse,
U.Umlaufdauer_in_Tagen as Umlaufdauer_Tage
from [dbo].[UmlaufbahnenTab] as U join [dbo].[HimmelskoerperTab] as Z on U.Zentralobjekt_ID = Z.ID
Join [dbo].[HimmelskoerperTab] as T on U.TrabantID = T.ID
Join [dbo].[HimmelskoerperTypenTab] as ZY On Z.HimmelskoerperTyp_ID = ZY.ID
Join [dbo].[HimmelskoerperTypenTab] as TY On T.HimmelskoerperTyp_ID = TY.ID
where Z.Name = @Zentralkoerpername
)
go
-- Test
select Trabant, Trabantmasse / dbo.Erdmasse() as Erdmassen
from dbo.Trabanten_von('Jupiter')
--where TrabantTyp ='Planet'