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.