U kunt een inline tabelwaardefunctie (ITVF) maken in SQL Server met behulp van de T-SQL CREATE FUNCTION
syntaxis.
Syntaxis
Hier is de officiële syntaxis voor inline TVF's.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
Voorbeeld 1 – Basis ITVF
Hier is een voorbeeld van een eenvoudige inline functie met tabelwaarde.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
In dit geval vereist de functie dat een kattennaam als argument wordt doorgegeven. Vervolgens gebruikt het dit argument in de query om de relevante gegevens te retourneren.
Voorbeeld 2 – Schemabinding toevoegen
Het is meestal een goed idee om uw functies schema te binden met behulp van de SCHEMABINDING
argument.
Als u dit doet, zorgt u ervoor dat de onderliggende tabellen niet kunnen worden gewijzigd op een manier die uw functie zou beïnvloeden.
Zonder schemabinding kunnen de onderliggende tabellen worden gewijzigd of zelfs verwijderd. Als u dit doet, kan de functie worden verbroken.
Hier is dezelfde functie, maar deze keer met schemabinding:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Merk op dat ik de tweedelige naam gebruikte bij het verwijzen naar de tabel in mijn zoekopdracht (ik gebruikte dbo.Cats
bij het verwijzen naar de tabel, in plaats van alleen Cats
). Dit is een vereiste om een object via een schema te binden. Als u een object via een schema probeert te binden zonder tweedelige namen te gebruiken, krijgt u een foutmelding.
Nu ik mijn functie schema gebonden heb, krijg ik een foutmelding als ik probeer de tabel waarnaar in de definitie wordt verwezen te laten vallen:
DROP TABLE Cats;
Resultaat:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
Trouwens, dit is wat er gebeurt als ik de functie probeer te maken zonder tweedelige naamgeving te gebruiken:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName = @CatName ); GO
Resultaat:
Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7 Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
Voorbeeld 3 – Codering toevoegen
U kunt uw functies ook versleutelen met de ENCRYPTION
argument.
Hier is een voorbeeld van het versleutelen van de functie:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Nu kan ik de definitie van de functie niet bekijken.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultaat:
+--------------+ | definition | |--------------| | NULL | +--------------+
Ik krijg ook een foutmelding wanneer ik de definitie van de functie probeer te scripten via Azure Data Studio:
No script was returned when scripting as Create on object UserDefinedFunction
Merk op dat de tekst van een gecodeerde functie nog steeds beschikbaar is voor bevoorrechte gebruikers die ofwel toegang hebben tot systeemtabellen via de DAC-poort of rechtstreeks toegang hebben tot databasebestanden. Ook kunnen gebruikers die een debugger aan het serverproces kunnen koppelen, de originele procedure tijdens runtime uit het geheugen halen.