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'