SQL Server wordt geleverd met een verzameling ingebouwde functies waarmee u verschillende bewerkingen kunt uitvoeren. Elke ingebouwde functie heeft een specifiek doel en kan niet worden gewijzigd. Als een functie uw doel dient, kunt u doorgaan en deze gebruiken.
Maar wat als u geen functie kunt vinden die uw doel dient?
Dan is het tijd om uw eigen door de gebruiker gedefinieerde functie te schrijven.
Wat is een door de gebruiker gedefinieerde functie?
Een door de gebruiker gedefinieerde functie (UDF) is een routine die parameters kan nemen, berekeningen of andere acties kan uitvoeren en een resultaat kan retourneren. En zoals de naam al doet vermoeden, wordt het gedefinieerd en gemaakt door de gebruiker. In dit geval is de "gebruiker" de SQL-programmeur, DBA of degene die de functie heeft geschreven.
De term door de gebruiker gedefinieerde functie onderscheidt deze van de ingebouwde functies die bij SQL Server worden geleverd.
U kunt specificeren of de UDF al dan niet parameters accepteert, en zo ja, hun namen, gegevenstypen, enz. U kunt bijvoorbeeld een UDF schrijven die een product-ID als argument accepteert. De functie kan dat dan gebruiken in zijn berekening. Dit betekent dat de uitvoer van de functie afhankelijk is van de invoer die eraan wordt geleverd wanneer deze wordt aangeroepen.
Nadat een UDF is gemaakt, kan deze worden aangeroepen.
Een door de gebruiker gedefinieerde functie oproepen
De code in de functie wordt niet uitgevoerd wanneer de functie wordt gemaakt. Het wordt alleen uitgevoerd wanneer de functie wordt aangeroepen .
Het 'aanroepen' van een functie wordt soms een functie 'aanroepen' genoemd. Dit is wanneer u de functie krijgt om te doen waarvoor deze is gemaakt. Kortom, je maakt een functie en dan wacht het daar gewoon om te worden aangeroepen.
U kunt een UDF aanroepen vanuit uw T-SQL-code, net zoals u een systeemfunctie zou aanroepen. U kunt bijvoorbeeld een UDF gebruiken in een WHERE
clausule om de resultaten van een SELECT
uitspraak. U kunt het ook gebruiken in de lijst met kolommen om terug te keren.
UDF's kunnen ook worden gebruikt in berekende kolommen. Dit kan handig zijn als u ooit een berekende kolom nodig heeft om toegang te krijgen tot gegevens in een andere kolom.
Parameters
Een door de gebruiker gedefinieerde functie kan tot 1024 invoerparameters accepteren. U kunt desgewenst echter ook een functie definiëren zonder parameters.
Een voorbeeld van een ingebouwde functie zonder parameters is GETDATE()
. Deze functie retourneert eenvoudig de huidige tijdstempel van het databasesysteem. U hoeft geen parameters door te geven om dat te krijgen.
Een voorbeeld van een door de gebruiker gedefinieerde functie met een enkele parameter kan een functie zijn die de contactgegevens van een klant retourneert op basis van de klant-ID. Wanneer u de functie aanroept, geeft u de klant-ID als parameter door aan de functie. De functie kan dan de gegevens van de klant opzoeken en teruggeven in de return-variabele. Als u de ID van een andere klant doorgeeft, retourneert de functie de details van die klant.
Voordelen van door de gebruiker gedefinieerde functies
Enkele van de belangrijkste voordelen van UDF's zijn de volgende.
- Modulair programmeren
- Met UDF's kunt u één keer code schrijven en deze vervolgens zo vaak aanroepen als nodig is. U hoeft niet elke keer dezelfde code te herschrijven als u hetzelfde moet doen. Roep in plaats daarvan gewoon de functie aan. Dit is ook handig als er iets verandert. Je hoeft het maar op één plek bij te werken:de functie. Als u de functie niet heeft gebruikt, moet u deze op meerdere plaatsen in uw toepassing bijwerken.
- Prestaties
- UDF's verlagen de compilatiekosten van de T-SQL-code door de plannen in de cache te plaatsen en ze opnieuw te gebruiken voor herhaalde uitvoeringen. De UDF hoeft niet bij elk gebruik opnieuw te worden geparseerd en geoptimaliseerd. Dit resulteert in veel snellere uitvoeringstijden.
- Minder netwerkverkeer
- Een bewerking die gegevens filtert op basis van een complexe beperking die niet kan worden uitgedrukt in een enkele scalaire expressie, kan worden uitgedrukt als een functie. De functie kan dan worden aangeroepen in de
WHERE
clausule om het aantal rijen dat naar de klant wordt gestuurd te verminderen.
UDF's kunnen ook andere, meer specifieke voordelen hebben, zoals in het vorige voorbeeld dat ik noemde met de berekende kolom die toegang heeft tot gegevens in een andere tabel.
Soorten door de gebruiker gedefinieerde functies
Er zijn twee soorten door de gebruiker gedefinieerde T-SQL-functies:
- Scalaire functies
- Door de gebruiker gedefinieerde scalaire functies retourneren een enkele gegevenswaarde. U definieert het type van de waarde in de functie. Het retourtype kan elk gegevenstype zijn, behalve tekst , ntekst , afbeelding , cursor , en tijdstempel .
- Tabel gewaardeerde functies
- Tafelwaardige functies (TVF's) retourneren een tabel. Hun retourtype is daarom tabel . Er zijn twee soorten TVF:inline TVF en TVF met meerdere verklaringen. Een inline TVF heeft geen functietekst. De retourtabel is het resultaat van een enkele
SELECT
uitspraak. Een multi-statement TVF daarentegen heeft wel een functielichaam. Bij multi-statement TVF's specificeert u de structuur van de tabel in de return-variabele.
U kunt ook scalaire en tabelwaardefuncties maken als door de gebruiker gedefinieerde functies voor Common Language Runtime (CLR).
Vanaf SQL Server 2005 (9.x) kunt u door de gebruiker gedefinieerde functies schrijven in elke Microsoft .NET Framework-programmeertaal, zoals Microsoft Visual Basic .NET of Microsoft Visual C#.