Du kan skapa en inline-tabellvärderad funktion (ITVF) i SQL Server med T-SQL CREATE FUNCTION
syntax.
Syntax
Här är den officiella syntaxen för inline TVF.
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 [ ) ] [ ; ]
Exempel 1 – Grundläggande ITVF
Här är ett exempel på en grundläggande inline-tabellvärderad funktion.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
I det här fallet kräver funktionen att ett kattnamn skickas in som ett argument. Den använder sedan detta argument i frågan för att returnera relevant data.
Exempel 2 – Lägg till schemabindning
Det är vanligtvis en bra idé att schemabinda dina funktioner genom att använda SCHEMABINDING
argument.
Genom att göra detta säkerställer du att de underliggande tabellerna inte kan ändras på ett sätt som skulle påverka din funktion.
Utan schemabindning kan de underliggande tabellerna ändras eller till och med raderas. Om du gör detta kan funktionen bryta.
Här är samma funktion, men den här gången med schemabindning:
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
Observera att jag använde det tvådelade namnet när jag refererade till tabellen i min fråga (jag använde dbo.Cats
när du hänvisar till tabellen, istället för bara Cats
). Att göra detta är ett krav för att schemabinda ett objekt. Om du försöker schemalägga ett objekt utan att använda tvådelade namn får du ett felmeddelande.
Nu när jag har schemalagt min funktion, om jag försöker ta bort tabellen som refereras till i dess definition, får jag ett felmeddelande:
DROP TABLE Cats;
Resultat:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
Förresten, här är vad som händer om jag försöker skapa funktionen utan att använda tvådelad namngivning:
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
Resultat:
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.
Exempel 3 – Lägg till kryptering
Du kan också kryptera dina funktioner med ENCRYPTION
argument.
Här är ett exempel på kryptering av funktionen:
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 jag inte se funktionens definition.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultat:
+--------------+ | definition | |--------------| | NULL | +--------------+
Jag får också ett felmeddelande när jag försöker skripta funktionens definition via Azure Data Studio:
No script was returned when scripting as Create on object UserDefinedFunction
Observera att en krypterad funktions text fortfarande är tillgänglig för privilegierade användare som antingen kan komma åt systemtabeller via DAC-porten eller direkt komma åt databasfiler. Användare som kan koppla en debugger till serverprocessen kan också hämta den ursprungliga proceduren från minnet vid körning.