sql >> Base de Datos >  >> RDS >> Sqlserver

Cree una función con valores de tabla en línea (ITVF) en SQL Server

Puede crear una función con valores de tabla en línea (ITVF) en SQL Server usando T-SQL CREATE FUNCTION sintaxis.

Sintaxis

Aquí está la sintaxis oficial para TVF en línea.

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 [ ) ]  
[ ; ]  

Ejemplo 1 – ITVF Básica

Este es un ejemplo de una función básica con valores de tabla en línea.

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

En este caso, la función requiere que se pase un nombre de gato como argumento. Luego usa este argumento en la consulta para devolver los datos relevantes.

Ejemplo 2:Agregar enlace de esquema

Por lo general, es una buena idea vincular sus funciones mediante el uso de SCHEMABINDING argumento.

Hacer esto asegurará que las tablas subyacentes no se puedan cambiar de una manera que afecte su función.

Sin vinculación de esquema, las tablas subyacentes podrían modificarse o incluso eliminarse. Hacer esto podría romper la función.

Aquí está la misma función, pero esta vez con enlace de esquema:

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

Observe que usé el nombre de dos partes al hacer referencia a la tabla en mi consulta (usé dbo.Cats al hacer referencia a la tabla, en lugar de solo Cats ). Hacer esto es un requisito para el enlace de esquema de un objeto. Si intenta enlazar un objeto mediante un esquema sin usar nombres de dos partes, obtendrá un error.

Ahora que he enlazado el esquema de mi función, si trato de eliminar la tabla a la que se hace referencia en su definición, aparece un error:

DROP TABLE Cats;

Resultado:

Msg 3729, Level 16, State 1, Line 1
Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.

Por cierto, esto es lo que sucede si intento crear la función sin usar nombres de dos partes:

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

Resultado:

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.

Ejemplo 3:agregar cifrado

También puede encriptar sus funciones usando ENCRYPTION argumento.

Aquí hay un ejemplo de encriptación de la función:

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

Ahora no puedo ver la definición de la función.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultado:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

También recibo un mensaje de error cuando intento escribir la definición de la función a través de Azure Data Studio:

No script was returned when scripting as Create on object UserDefinedFunction

Tenga en cuenta que el texto de una función encriptada todavía está disponible para usuarios privilegiados que pueden acceder a las tablas del sistema a través del puerto DAC o acceder directamente a los archivos de la base de datos. Además, los usuarios que pueden adjuntar un depurador al proceso del servidor pueden recuperar el procedimiento original de la memoria en tiempo de ejecución.