mk-prg-net \ ms-sql \ tsql \ddl \create-udf

Benutzerdefinierte Funktionen

Mit benutzerdefinierte Funktionen kann der Datenbankentwickler die Funktionalität von TSQL erweitern. Es gibt drei Typen von benutzerdefinierten Funktionen:

  1. Skalarfunktionen
  2. Tabellenwertfunktionen
  3. 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'