Sie können eine Inline-Tabellenwertfunktion (ITVF) in SQL Server mithilfe von T-SQL CREATE FUNCTION
erstellen Syntax.
Syntax
Hier ist die offizielle Syntax für Inline-TVFs.
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 [ ) ] [ ; ]
Beispiel 1 – Grundlegende ITVF
Hier ist ein Beispiel für eine einfache Inline-Tabellenwertfunktion.
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 diesem Fall muss der Funktion ein Katzenname als Argument übergeben werden. Dieses Argument wird dann in der Abfrage verwendet, um die relevanten Daten zurückzugeben.
Beispiel 2 – Schemabindung hinzufügen
Es ist normalerweise eine gute Idee, Ihre Funktionen mithilfe von SCHEMABINDING
an ein Schema zu binden Streit.
Dadurch wird sichergestellt, dass die zugrunde liegenden Tabellen nicht in einer Weise geändert werden können, die Ihre Funktion beeinträchtigen würde.
Ohne Schemabindung könnten die zugrunde liegenden Tabellen geändert oder sogar gelöscht werden. Dadurch könnte die Funktion unterbrochen werden.
Hier ist die gleiche Funktion, aber diesmal mit Schemabindung:
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
Beachten Sie, dass ich den zweiteiligen Namen verwendet habe, als ich in meiner Abfrage auf die Tabelle verwiesen habe (ich habe dbo.Cats
verwendet wenn auf die Tabelle verwiesen wird, statt nur Cats
). Dies ist eine Voraussetzung für die Schemabindung eines Objekts. Wenn Sie versuchen, ein Objekt an ein Schema zu binden, ohne zweiteilige Namen zu verwenden, erhalten Sie eine Fehlermeldung.
Jetzt, da ich meine Funktion schemagebunden habe, erhalte ich eine Fehlermeldung, wenn ich versuche, die Tabelle, auf die in ihrer Definition verwiesen wird, zu löschen:
DROP TABLE Cats;
Ergebnis:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
Übrigens passiert Folgendes, wenn ich versuche, die Funktion ohne zweiteilige Benennung zu erstellen:
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
Ergebnis:
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.
Beispiel 3 – Verschlüsselung hinzufügen
Sie können Ihre Funktionen auch mit ENCRYPTION
verschlüsseln Streit.
Hier ist ein Beispiel für die Verschlüsselung der Funktion:
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
Jetzt kann ich die Definition der Funktion nicht anzeigen.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Ergebnis:
+--------------+ | definition | |--------------| | NULL | +--------------+
Ich erhalte auch eine Fehlermeldung, wenn ich versuche, die Definition der Funktion über Azure Data Studio zu skripten:
No script was returned when scripting as Create on object UserDefinedFunction
Beachten Sie, dass der Text einer verschlüsselten Funktion weiterhin für privilegierte Benutzer verfügbar ist, die entweder über den DAC-Port auf Systemtabellen oder direkt auf Datenbankdateien zugreifen können. Außerdem können Benutzer, die einen Debugger an den Serverprozess anhängen können, die ursprüngliche Prozedur zur Laufzeit aus dem Speicher abrufen.