Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie eine Inline-Tabellenwertfunktion (ITVF) in SQL Server

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.