Compartir a través de


CREATE FUNCTION

Se aplica a:Punto de conexión de SQL Analytics y Almacenamiento en Microsoft Fabric

CREATE FUNCTION puede crear funciones de valores de tabla insertadas y funciones escalares.

Nota

Las UDF escalares son una característica en versión preliminar de Fabric Data Warehouse.

Importante

En Fabric Data Warehouse, las UDF escalares deben estar insertadas para su uso con SELECT ... FROM consultas en tablas de usuario, pero todavía puede crear funciones que no se pueden insertar. UDF escalares que no son trabajos insertables en un número limitado de escenarios. Puede comprobar si se puede insertar una UDF.

Una función definida por el usuario es una rutina de Transact-SQL que acepta parámetros, realiza una acción, como un cálculo complejo, y devuelve el resultado de esa acción como un valor. Las funciones escalares devuelven un valor escalar, como un número o una cadena. Las funciones con valores de tabla (TVF) definidas por el usuario devuelven una tabla.

Use CREATE FUNCTION para crear una rutina de T-SQL reutilizable que se pueda usar de estas maneras:

  • En instrucciones Transact-SQL, como SELECT
  • En Transact-SQL instrucciones de manipulación de datos (DML), como UPDATE, INSERTy DELETE
  • En las aplicaciones que llaman a la función
  • En la definición de otra función definida por el usuario
  • Para reemplazar un procedimiento almacenado

Sugerencia

Puede especificar CREATE OR ALTER FUNCTION para crear una nueva función si no existe por ese nombre, o modificar una función existente, en una sola instrucción.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis de función escalar

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Sintaxis de función con valores de tabla insertada

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumentos

schema_name

Nombre del esquema al que pertenece la función definida por el usuario.

function_name

Nombre de la función definida por el usuario. Los nombres de funciones deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.

Nota

Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.

@ parameter_name

Parámetro de la función definida por el usuario. Es posible declarar uno o varios parámetros.

Una función puede tener un máximo de 2.100 parámetros. El usuario debe proporcionar el valor de cada parámetro declarado cuando se ejecuta la función, a menos que se defina un valor predeterminado para el parámetro.

Especifique un nombre de parámetro con una arroba ( @ ) como primer carácter. El nombre del parámetro debe cumplir las mismas reglas para identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones. Los parámetros solamente pueden ocupar el lugar de constantes; no se pueden utilizar en lugar de nombres de tablas, nombres de columnas o nombres de otros objetos de base de datos.

Nota

ANSI_WARNINGS no se respeta cuando se pasan parámetros en un procedimiento almacenado, una función definida por el usuario o cuando se declaran y establecen variables en una instrucción batch. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.

parameter_data_type

Tipo de datos de parámetro. Para Transact-SQL funciones, se permiten todos los tipos de datos escalares admitidos .

[ = predeterminado ]

Valor predeterminado del parámetro. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.

Cuando un parámetro de la función tiene un valor predeterminado, se debe especificar la palabra DEFAULT clave cuando se llama a la función para recuperar el valor predeterminado. Este comportamiento es distinto del uso de parámetros con valores predeterminados en los procedimientos almacenados, donde la omisión del parámetro implica especificar el valor predeterminado.

return_data_type

Valor devuelto de una función escalar definida por el usuario.

En el caso de las funciones de Fabric Data Warehouse, se permiten todos los tipos de datos, excepto lamarca de tiemporowversion/. No se permiten tipos no escalares, como la tabla .

function_body

Una serie de instrucciones Transact-SQL.

En las funciones escalares, function_body es una serie de instrucciones de Transact-SQL que se evalúan conjuntamente como un valor escalar, que puede incluir:

  • Expresión de instrucción única
  • Expresiones de varias instrucciones (IF/THEN/ELSE y BEGIN/END bloques)
  • Variables locales
  • Llamadas a funciones SQL integradas disponibles
  • Llamadas a otras UDF
  • SELECT instrucciones y referencias a tablas, vistas y funciones con valores de tabla insertados

scalar_expression

Especifica el valor escalar que devuelve la función escalar.

select_stmt

Instrucción única SELECT que define el valor devuelto de una función insertada con valores de tabla. Para una función insertada con valores de tabla, no hay ningún cuerpo de función; la tabla es el conjunto de resultados de una sola SELECT instrucción.

TABLA

Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solamente se pueden pasar constantes y @local_variables a las TVF.

En las TVF insertadas (versión preliminar), el valor devuelto TABLE se define a través de una sola SELECT instrucción. Las funciones insertadas no tienen variables devueltas asociadas.

<function_option>

En Fabric Data Warehouse, no se admiten las INLINEpalabras clave , ENCRYPTIONy EXECUTE AS .

Las opciones de función admitidas incluyen:

SCHEMABINDING

Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función. En primer lugar, se debe modificar o quitar la propia definición de la función para quitar las dependencias en el objeto que se va a modificar.

El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:

  • Se quita la función.

  • La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.

Una función se puede enlazar a esquema solamente si se cumplen las siguientes condiciones:

  • Las funciones definidas por el usuario a las que hace referencia la función también están enlazadas a esquema.

  • Se hace referencia a los objetos a los que hace referencia la función mediante un nombre de dos partes.

  • En el cuerpo de las funciones definidas por el usuario solo se puede hacer referencia a las funciones integradas y a otras funciones definidas por el usuario de la misma base de datos.

  • El usuario que ejecutó la CREATE FUNCTION instrucción tiene permiso REFERENCES en los objetos de base de datos a los que hace referencia la función.

Para quitar SCHEMABINDING, use ALTER.

DEVUELVE NULL EN ENTRADA NULL | SE LLAMA A ON NULL INPUT (LLAMADA EN ENTRADA NULL)

Especifica el OnNULLCall atributo de una función con valores escalares. Si no se especifica, CALLED ON NULL INPUT está implícito de forma predeterminada y el cuerpo de la función se ejecuta incluso si NULL se pasa como argumento.

procedimientos recomendados

  • Si no se crea una función definida por el usuario con el enlace de esquemas, los cambios realizados en los objetos subyacentes pueden afectar a la definición de la función y generar resultados inesperados cuando se invoca. Se recomienda especificar la WITH SCHEMABINDING cláusula al crear la función. Así se asegura de que no se pueden modificar los objetos a los que se hace referencia en la definición de la función a menos que también se modifique la función.

  • Escribir las funciones definidas por el usuario para que sean insertables. Para obtener más información, vea Inserción de UDF escalares.

Interoperabilidad

Funciones definidas por el usuario con valores de tabla insertadas

En una función con valores de tabla insertados, solo se permite una sola instrucción select.

Funciones escalares definidas por el usuario

  • Las siguientes instrucciones son válidas en una función con valores escalares:

    • Instrucciones de asignación
    • Instrucciones control-of-Flow excepto TRY...CATCH instrucciones
    • DECLARE instrucciones que definen variables de datos locales
  • Las siguientes funciones integradas no se admiten en un cuerpo de función con valores escalares:

  • Las UDF escalares no se pueden usar en una consulta en una SELECT ... FROM tabla de usuario cuando:

  • Las UDF escalares no se pueden usar en una consulta cuando:

    • Se llama directamente a UDF en una GROUP BY cláusula .
    • Se llama directamente a UDF en una ORDER BY cláusula .
    • la consulta de llamada tiene una expresión de tabla común (CTE).
  • No se admiten UDF escalares recursivas.

  • Una consulta de usuario puede producir un error si se realizan más de 10 llamadas UDF en una sola consulta.

  • En algunos casos perimetrales, la complejidad de la consulta de usuario y el cuerpo de UDF impide la inserción, en cuyo caso la UDF escalar no está insertada y se produce un error en la consulta del usuario.

  • Cuando se usa una UDF escalar en cualquier escenario no admitido, verá un mensaje de error "Scalar UDF execution is currently unavailable in this context."

Limitaciones

Nota

Durante la versión preliminar actual, las limitaciones están sujetas a cambios.

Las funciones definidas por el usuario no se pueden utilizar para realizar acciones que modifican el estado de la base de datos.

Las funciones definidas por el usuario se pueden anidar; es decir, una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando se empieza a ejecutar la función llamada y disminuye cuando se termina de ejecutar la función llamada. Las funciones definidas por el usuario en Fabric Data Warehouse se pueden anidar hasta cuatro niveles cuando un cuerpo de UDF hace referencia a una función con valores de tabla,vista o en línea, o hasta 32 niveles en caso contrario. Si se superan los niveles máximos de anidamiento, se produce un error en la cadena de funciones que realiza la llamada.

Metadatos

En esta sección se enumeran las vistas de catálogo del sistema que se pueden usar para devolver metadatos sobre funciones definidas por el usuario.

  • sys.sql_modules: muestra la definición de Transact-SQL funciones definidas por el usuario. Por ejemplo:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: muestra información sobre los parámetros definidos en funciones definidas por el usuario.

  • sys.sql_expression_dependencies: muestra los objetos subyacentes a los que hace referencia una función.

Permisos

Los miembros de los roles Administrador, Miembro y Colaborador del área de trabajo de Fabric pueden crear funciones.

Inserción de UDF escalar

Microsoft Fabric Data Warehouse usa la inserción de UDF escalar para compilar y ejecutar código definido por el usuario de forma distribuida. La inserción de UDF escalar está habilitada de forma predeterminada.

Aunque la inserción escalar de UDF es una técnica de optimización del rendimiento introducida primero en Microsoft SQL Server 2019 (15.0), en Fabric Data Warehouse determina el conjunto admitido de escenarios. En Fabric Data Warehouse, las UDF escalares se transforman automáticamente en expresiones escalares o subconsultas escalares que se sustituyen en la consulta de llamada en lugar del operador UDF.

Algunas sintaxis de T-SQL hacen que una UDF escalar no se pueda insertar. Las funciones que contienen un WHILE bucle, varias RETURN instrucciones o una llamada a una función integrada de SQL no determinista (como GETUTCDATE() o GETDATE()) no se pueden insertar. Para obtener más información, consulte Requisitos de inserción de UDF escalares.

Comprobar si se puede insertar una UDF escalar

La sys.sql_modules vista de catálogo incluye la columna is_inlineable, que indica si una UDF es insertable.

La is_inlineable propiedad se deriva de la comprobación de la sintaxis dentro de la definición de UDF. La UDF escalar no está insertada antes del tiempo de compilación. Un valor de 1 indica que la UDF es insertable, mientras que un valor de 0 indica que no es insertable. Si una UDF escalar es insertable, no garantiza que siempre se inserte cuando se compile la consulta.

Fabric Data Warehouse decide (por consulta) si se debe insertar una UDF, en función de la complejidad general de las consultas.

Use la siguiente consulta de ejemplo para comprobar si una UDF escalar es insertable:

SELECT 
SCHEMA_NAME(b.schema_id) as function_schema_name,
    b.name as function_name,
       b.type_desc as function_type,
       a.is_inlineable
FROM sys.sql_modules AS a
     INNER JOIN sys.objects AS b
         ON a.object_id = b.object_id
WHERE b.type IN ('FN');

Si una función escalar no es insertable en sys.sql_modules.is_inlineable, todavía puede ejecutar la consulta como una llamada independiente, por ejemplo, para establecer una variable. Pero la función escalar no puede formar parte de una SELECT ... FROM consulta en una tabla de usuario. Por ejemplo:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

dbo.custom_SYSUTCDATETIME La función escalar de ejemplo definida por el usuario no es insertable debido al uso de una función del sistema no determinante, SYSUTCDATETIME(). Se producirá un error cuando se use en una consulta en una SELECT ... FROM tabla de usuario, pero se realizará correctamente como una llamada independiente, por ejemplo:

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

Ejemplos

A Creación de una función alineada con valores de tabla

En el ejemplo siguiente se crea una función con valores de tabla insertados para devolver cierta información clave sobre los módulos, filtrando por el parámetro objectType. Incluye un valor predeterminado para devolver todos los módulos cuando se llama a la función con el DEFAULT parámetro . En este ejemplo se usan algunas de las vistas de catálogo del sistema mencionadas en Metadatos.

CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
        SELECT sm.object_id AS 'Object Id',
            o.create_date AS 'Date Created',
            OBJECT_NAME(sm.object_id) AS 'Name',
            o.type AS 'Type',
            o.type_desc AS 'Type Description',
            sm.DEFINITION AS 'Module Description',
            sm.is_inlineable AS 'Inlineable'
        FROM sys.sql_modules AS sm
        INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE o.type LIKE '%' + @objectType + '%'
        );
GO

A continuación, se puede llamar a la función para devolver todas las funciones insertadas con valores de tabla (IF) con:

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

O bien, busque todas las funciones escalares (FN):

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. Combinación de resultados de una función con valores de tabla insertados

En este sencillo ejemplo se usa la función con valores de tabla insertados creada anteriormente para mostrar cómo se pueden combinar sus resultados con otras tablas mediante CROSS APPLY. Aquí, se seleccionan todas las columnas de y sys.objects los resultados de ModulesByType para todas las filas que coinciden en la type columna. Para obtener más información sobre el uso de apply, vea CLÁUSULA FROM más JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. Creación de una función UDF escalar

En el ejemplo siguiente se crea una UDF escalar insertable que enmascara un texto de entrada.

CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @Result VARCHAR(50)
        DECLARE @CleanedInput VARCHAR(50)

        -- Trim whitespace
        SET @CleanedInput = LTRIM(RTRIM(@InputString))

        -- Handle empty or null input
        IF @CleanedInput = '' OR @CleanedInput IS NULL
        BEGIN
            SET @Result = ''
        END
        ELSE IF LEN(@CleanedInput) <= 2
        BEGIN
            -- If string length is 1 or 2, just return the cleaned string
            SET @Result = @CleanedInput
        END
        ELSE
        BEGIN
            -- Construct the masked string
            SET @Result = 
                LEFT(@CleanedInput, 1) +
                REPLICATE('*', LEN(@CleanedInput) - 2) +
                RIGHT(@CleanedInput, 1)
        END

        RETURN @Result
    END

Puede llamar a la función de la siguiente manera:

DECLARE @input varchar(100) = '123456789'

SELECT dbo.cleanInput (@input) AS function_output;

Más ejemplos de cómo puede usar UDF escalares en Fabric Data Warehouse:

En una SELECT instrucción :

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

En una WHERE cláusula :

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'

En una JOIN cláusula :

SELECT t1.id, t1.name, 
     dbo.cleanInput (t1.name) AS function_output, 
     dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
    INNER JOIN dbo.MyTable2 AS t2 
        ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);

En una ORDER BY cláusula :

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

En instrucciones del lenguaje de manipulación de datos (DML) como INSERT, UPDATEo DELETE:

SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output 
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;

UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;

DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';

Se aplica a:Azure Synapse AnalyticsAnalytics Platform System (PDW)

Crea una función definida por el usuario (UDF) en Azure Synapse Analytics o Analytics Platform System (PDW). Una función definida por el usuario es una rutina de Transact-SQL que acepta parámetros, realiza una acción, como un cálculo complejo, y devuelve el resultado de esa acción como un valor. Las funciones con valores de tabla definidas por el usuario (TVF) devuelven un tipo de datos table.

  • En Sistema de la plataforma de análisis (PDW), el valor devuelto debe ser un valor escalar (único).

  • En Azure Synapse Analytics, CREATE FUNCTION puede devolver una tabla mediante la sintaxis de las funciones con valores de tabla insertados (versión preliminar) o puede devolver un único valor mediante la sintaxis de las funciones escalares.

  • En los grupos de SQL sin servidor de Azure Synapse Analytics, CREATE FUNCTION puede crear funciones de valores de tabla insertadas, pero no funciones escalares.

    Utilice esta instrucción para crear una rutina reutilizable que se pueda utilizar de estas formas:

  • En instrucciones Transact-SQL, como SELECT

  • En las aplicaciones que llaman a la función

  • En la definición de otra función definida por el usuario

  • Para definir una restricción CHECK en una columna

  • Para reemplazar un procedimiento almacenado

  • Usar una función insertada como predicado de filtro de la directiva de seguridad

Sugerencia

Para ver la sintaxis de Fabric Data Warehouse, consulte la versión de CREATE FUNCTION para Microsoft Fabric Data Warehouse.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis de función escalar

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Sintaxis de función con valores de tabla insertada

-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumentos

schema_name

Nombre del esquema al que pertenece la función definida por el usuario.

function_name

Nombre de la función definida por el usuario. Los nombres de funciones deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.

Nota

Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.

@ parameter_name

Parámetro de la función definida por el usuario. Es posible declarar uno o varios parámetros.

Una función puede tener un máximo de 2.100 parámetros. El usuario debe proporcionar el valor de cada parámetro declarado cuando se ejecuta la función, a menos que se defina un valor predeterminado para el parámetro.

Especifique un nombre de parámetro con una arroba ( @ ) como primer carácter. El nombre del parámetro debe cumplir las mismas reglas para identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones. Los parámetros solamente pueden ocupar el lugar de constantes; no se pueden utilizar en lugar de nombres de tablas, nombres de columnas o nombres de otros objetos de base de datos.

Nota

ANSI_WARNINGS no se respeta cuando se pasan parámetros en un procedimiento almacenado, una función definida por el usuario o cuando se declaran y establecen variables en una instrucción batch. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.

parameter_data_type

Tipo de datos de parámetro. En las funciones de Transact-SQL, se permiten todos los tipos de datos escalares admitidos en Azure Synapse Analytics. El tipo de datos timestamp (rowversion) no es un tipo admitido.

[ = predeterminado ]

Valor predeterminado del parámetro. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.

Cuando un parámetro de la función tiene un valor predeterminado, se debe especificar la palabra clave DEFAULT al llamar a la función para recuperar el valor predeterminado. Este comportamiento es distinto del uso de parámetros con valores predeterminados en los procedimientos almacenados, donde la omisión del parámetro implica especificar el valor predeterminado.

return_data_type

Valor devuelto de una función escalar definida por el usuario. En las funciones de Transact-SQL, se permiten todos los tipos de datos escalares admitidos en Azure Synapse Analytics. El tipo de datos rowversion/timestamp no es un tipo admitido. No se permiten los tipos de datos no escalares de cursor y tabla.

function_body

Serie de instrucciones de Transact-SQL. El function_body no puede contener una SELECT instrucción y no puede hacer referencia a datos de base de datos. El function_body no puede hacer referencia a tablas ni vistas. El cuerpo de la función puede llamar a otras funciones deterministas, pero no a funciones no deterministas.

En las funciones escalares, function_body es una serie de instrucciones de Transact-SQL que se evalúan como un valor escalar.

scalar_expression

Especifica el valor escalar que devuelve la función escalar.

select_stmt

Instrucción única SELECT que define el valor devuelto de una función insertada con valores de tabla. Para una función insertada con valores de tabla, no hay ningún cuerpo de función; la tabla es el conjunto de resultados de una sola SELECT instrucción.

TABLA

Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solamente se pueden pasar constantes y @local_variables a las TVF.

En las TVF insertadas (versión preliminar), el valor devuelto TABLE se define a través de una sola SELECT instrucción. Las funciones insertadas no tienen variables devueltas asociadas.

<function_option>

Especifica que la función tiene una o varias de las siguientes opciones.

SCHEMABINDING

Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función. En primer lugar, se debe modificar o quitar la propia definición de la función para quitar las dependencias en el objeto que se va a modificar.

El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:

  • Se quita la función.

  • La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.

Una función se puede enlazar a esquema solamente si se cumplen las siguientes condiciones:

  • Las funciones definidas por el usuario a las que hace referencia la función también están enlazadas a esquema.

  • Se hace referencia a las funciones y otras funciones definidas por el usuario a las que hace referencia la función mediante un nombre de una o dos partes.

  • En el cuerpo de las funciones definidas por el usuario solo se puede hacer referencia a las funciones integradas y a otras funciones definidas por el usuario de la misma base de datos.

  • El usuario que ejecutó la CREATE FUNCTION instrucción tiene permiso REFERENCES en los objetos de base de datos a los que hace referencia la función.

Para quitar SCHEMABINDING, use ALTER.

DEVUELVE NULL EN ENTRADA NULL | SE LLAMA A ON NULL INPUT (LLAMADA EN ENTRADA NULL)

Especifica el OnNULLCall atributo de una función con valores escalares. Si no se especifica, CALLED ON NULL INPUT está implícito de forma predeterminada y el cuerpo de la función se ejecuta incluso si NULL se pasa como argumento.

procedimientos recomendados

Si una función definida por el usuario no se crea con la cláusula SCHEMABINDING, los cambios que se realicen en los objetos subyacentes pueden afectar a la definición de la función y generar resultados inesperados al invocarla. Se recomienda especificar la WITH SCHEMABINDING cláusula al crear la función. Así se asegura de que no se pueden modificar los objetos a los que se hace referencia en la definición de la función a menos que también se modifique la función.

Interoperabilidad

Las siguientes instrucciones son válidas en una función con valores escalares:

  • Instrucciones de asignación.

  • Instrucciones de control de flujo, excepto las instrucciones TRY...CATCH.

  • Instrucciones DECLARE que definen variables de datos locales.

En una función con valores de tabla insertados (versión preliminar), solo se permite una única instrucción SELECT.

Limitaciones

Las funciones definidas por el usuario no se pueden utilizar para realizar acciones que modifican el estado de la base de datos.

Las funciones definidas por el usuario se pueden anidar; es decir, una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando se empieza a ejecutar la función llamada y disminuye cuando se termina de ejecutar la función llamada. Si se superan los niveles máximos de anidamiento, la cadena completa de funciones de llamada produce un error. En Microsoft Fabric Data Warehouse, las funciones definidas por el usuario se pueden anidar hasta cinco niveles.

Los objetos, incluidas las funciones, no se pueden crear en la base de datos master del grupo de SQL sin servidor en Azure Synapse Analytics.

Metadatos

En esta sección se enumeran las vistas de catálogo del sistema que se pueden usar para devolver metadatos sobre funciones definidas por el usuario.

  • sys.sql_modules: muestra la definición de Transact-SQL funciones definidas por el usuario. Por ejemplo:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: muestra información sobre los parámetros definidos en funciones definidas por el usuario.

  • sys.sql_expression_dependencies: muestra los objetos subyacentes a los que hace referencia una función.

Permisos

Se requiere el permiso CREATE FUNCTION en la base de datos y el permiso ALTER en el esquema en el que se va a crear la función.

Ejemplos

A Uso de una función definida por el usuario con valores escalares para cambiar un tipo de datos

Esta función simple toma un tipo de datos int como entrada y devuelve un tipo de datos decimal (10,2) como salida.

CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)  
RETURNS decimal(10,2)  
AS  
BEGIN
    DECLARE @MyValueOut int;  
    SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));  
    RETURN(@MyValueOut);  
END;  
GO  

SELECT dbo.ConvertInput(15) AS 'ConvertedValue';  

Nota

Las funciones escalares no están disponibles en los grupos de SQL sin servidor.

B. Creación de una función alineada con valores de tabla

En el ejemplo siguiente se crea una función con valores de tabla insertados para devolver cierta información clave sobre los módulos, filtrando por el parámetro objectType. Incluye un valor predeterminado para devolver todos los módulos cuando se llama a la función con el DEFAULT parámetro . En este ejemplo se usan algunas de las vistas de catálogo del sistema mencionadas en Metadatos.

CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
    SELECT 
        sm.object_id AS 'Object Id',
        o.create_date AS 'Date Created',
        OBJECT_NAME(sm.object_id) AS 'Name',
        o.type AS 'Type',
        o.type_desc AS 'Type Description', 
        sm.definition AS 'Module Description'
    FROM sys.sql_modules AS sm  
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    WHERE o.type like '%' + @objectType + '%'
);
GO

A continuación, se puede llamar a la función para devolver todos los objetos de vista (V) con:

select * from dbo.ModulesByType('V');

Nota

Las funciones de valores de tabla insertados están disponibles en los grupos de SQL sin servidor, pero en versión preliminar en los grupos de SQL dedicados.

C. Combinación de resultados de una función con valores de tabla insertados

En este sencillo ejemplo se usa la función con valores de tabla insertados creada anteriormente para mostrar cómo se pueden combinar sus resultados con otras tablas mediante CROSS APPLY. Aquí, se seleccionan todas las columnas de y sys.objects los resultados de ModulesByType para todas las filas que coinciden en la type columna. Para obtener más información sobre el uso de apply, vea CLÁUSULA FROM más JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

Nota

Las funciones de valores de tabla insertados están disponibles en los grupos de SQL sin servidor, pero en versión preliminar en los grupos de SQL dedicados.

Paso siguiente