CREATE FUNCTION

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

CREATE FUNCTION crea funciones de tabla en línea y funciones escalares.

Nota

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

Una función definida por el usuario es una rutina Transact-SQL que acepta parámetros, realiza una acción como un cálculo complejo y devuelve el resultado de esa acción como 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.

Úsalo CREATE FUNCTION para crear una rutina T-SQL reutilizable que puedas emplear de estas maneras:

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

Especificar CREATE OR ALTER FUNCTION crear una nueva función si no existe con ese nombre, o alterar una función existente, en una sola sentencia.

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>::=   
{  
    [ INLINE = AUTO ]
  | [ 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 las funciones deben seguir las reglas de los identificadores y ser únicos dentro de la base de datos y su esquema.

Debes incluir paréntesis después del nombre de la función aunque no especifiques un parámetro.

@ parameter_name

Parámetro de la función definida por el usuario. Puedes declarar uno o más parámetros.

Una función puede tener hasta 2.100 parámetros. Cuando un usuario o aplicación llama a una función, se debe proporcionar el valor de cada parámetro declarado a menos que se defina un valor predeterminado para dicho parámetro.

Especifique un nombre de parámetro con una arroba ( @ ) como primer carácter. El nombre del parámetro debe seguir las reglas de identificadores. Los parámetros son locales a la función; Puedes usar los mismos nombres de parámetros en otras funciones. Los parámetros solo pueden sustituir constantes; No pueden usarse en lugar de nombres de tablas, columnas o nombres de otros objetos de base de datos.

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 por lotes. Por ejemplo, si defines una variable como char(3) y luego la asignas a un valor mayor que tres caracteres, los datos se truncan al tamaño definido y la instrucción SQL tiene éxito.

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 defines un valor por defecto , puedes ejecutar la función sin especificar un valor para ese parámetro.

Cuando un parámetro de la función tiene un valor por defecto, debes especificar la palabra clave DEFAULT al llamar a la función para recuperar el valor por defecto. 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 tiempo/. No se permiten tipos no escalares como tablas .

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
  • Sentencias de flujo de control (WHILE bucles, RETURNS)

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 en línea con valores de tablas, no existe cuerpo de funciones; la tabla es el conjunto de resultados de una única SELECT afirmación.

TABLE

Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solo puedes pasar constantes y @local_variables a TVFs.

En los TVF en línea (previsualización), defines el TABLE valor de retorno mediante una sola SELECT sentencia. Las funciones en línea no tienen variables de retorno asociadas.

<function_option>

En Fabric Data Warehouse, las ENCRYPTION palabras clave y EXECUTE AS no están soportadas.

Las opciones de función soportadas incluyen:

EN LÍNEA = AUTO

Especifica si una función escalar definida por el usuario puede ser creada o modificada independientemente de los requisitos de inlining. La INLINE cláusula es opcional. Para una UDF escalar inlineable, especificar INLINE = AUTO no cambia su inlineabilidad ni su comportamiento de ejecución.

SCHEMABINDING

Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando especificas SCHEMABINDING, no puedes modificar los objetos subyacentes (como una vista o una tabla, por ejemplo) de una manera que afecte a la definición de la función. Primero debes modificar o eliminar la definición de función para eliminar dependencias del objeto que quieres 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:

  • Dejas la función.

  • ALTER usas la declaración de función y eliminas la SCHEMABINDING opción.

Solo puedes asignar un esquema a una función si se cumplen las siguientes condiciones:

  • Cualquier función definida por el usuario a la que la función haga referencia también está limitada al esquema.

  • La función hace referencia a los objetos usando un nombre de dos partes.

  • Dentro del cuerpo de UDFs, solo puedes referenciar funciones integradas y otros UDFs en la misma base de datos.

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

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 especificas este atributo, CALLED ON NULL INPUT está implícito por defecto, y el cuerpo de la función se ejecuta incluso si NULL se pasa como argumento.

procedimientos recomendados

Importante

En Fabric Data Warehouse, los UDF escalares deben ser inlineables para usarse con SELECT ... FROM consultas en tablas de usuario, pero aún puedes crear funciones que no sean inlineables especificando la WITH INLINE = AUTO opción de función. Los UDF escalares que no son inlineables funcionan en un número limitado de escenarios. Puede comprobar si se puede insertar una UDF.

  • Si no creas una función definida por el usuario con schemabinding, los cambios en los objetos subyacentes pueden afectar la definición de la función y causar resultados inesperados al invocar la función. Cuando especificas WITH SCHEMABINDING cuándo creas la función, te aseguras de que los cambios posteriores en los objetos subyacentes no puedan modificar ni romper el comportamiento de la función.

  • Escribe tus funciones definidas por el usuario para que sean inlineables. Para más información sobre el concepto de inlining, véase Inlining of scalar UDF. Para ejemplos de cómo hacer que una UDF escalar sea inlineable, véase Crear UDF escalar en Microsoft Fabric Data Warehouse.

Interoperabilidad

Funciones definidas por el usuario con valores de tabla insertadas

Una función con valores en tabla en línea acepta solo una sentencia.SELECT

Funciones escalares definidas por el usuario

  • No se puede usar una función no inlineable en una SELECT ... FROM consulta en una tabla de usuario.

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

    • Instrucciones de asignación.
    • Sentencias de control de flujo excepto TRY...CATCH y GOTO sentencias.
    • DECLARE sentencias que definen variables de datos locales.
    • Llamadas a funciones integradas.
    • Referencias a tablas/vistas/iTVFs/otros UDFs escalares.
  • Las sentencias DML no están permitidas en funciones escalares definidas por el usuario.

  • Las siguientes funciones integradas no se admiten en un cuerpo de función con valores escalares:

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_módulos: Muestra la definición de Transact-SQL funciones definidas por el usuario, así como información sobre la inlineabilidad. Por ejemplo:

      SELECT 
          SCHEMA_NAME(o.schema_id) AS SchemaName,
          o.name AS FunctionName,
          m.definition AS FunctionDefinition,
          m.is_inlineable AS Inlineable,
          m.inline_eligibility_mask AS InlineEligibilityMask
      FROM sys.objects o
      JOIN sys.sql_modules m ON o.object_id = m.object_id
      WHERE o.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.

Enlineamiento de la UDF escalar

Microsoft Fabric Data Warehouse utiliza diferentes técnicas de inlining para compilar y ejecutar código definido por el usuario de forma distribuida.

El inlining de la UDF escalar está activado por defecto.

Algunas sintaxis de T-SQL hacen que una UDF escalar no se pueda insertar. Por ejemplo, las funciones que contienen una combinación de un WHILE bucle y hacen referencia a una tabla dentro del cuerpo UDF no pueden ser en línea.

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 proviene de comprobar la sintaxis dentro de la definición de la UDF. El UDF escalar solo se inline en tiempo de compilación.

La inline_eligibility_mask propiedad explica qué tipo de inlining es aplicable a una UDF.

  • Un valor de 0 significa que la UDF no es inlineable.
  • Un valor de 1 indica que la UDF es elegible para la inlining Scalar UDF.
  • Un valor de 2 significa que la UDF es elegible para inlining mediante bloque de Expresión.
  • Un valor de 3 significa que UDF es elegible para cualquiera de las técnicas de inlining.

Importante

Si un UDF escalar es inlineable solo mediante inlining escalar UDF, no garantiza que siempre esté inlineado cuando se compila la consulta.

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 inlineable en sys.sql_modules.is_inlineable, aún puedes ejecutar la consulta como una llamada independiente, por ejemplo, para establecer una variable. 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

La función escalar definida por el usuario de muestra dbo.custom_SYSUTCDATETIME no es inlineable porque utiliza una función del sistema no determinista, SYSUTCDATETIME(). Falla cuando se utiliza en una SELECT ... FROM consulta en una tabla de usuario, pero tiene éxito como llamada independiente. Por ejemplo:

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

Limitaciones

Nota

Las UDF escalares son una característica en versión preliminar de Fabric Data Warehouse. Durante la versión preliminar actual, las limitaciones están sujetas a cambios.

  • Cuando se utiliza un UDF escalar en cualquier escenario no soportado, se ve un mensaje Scalar UDF execution is currently unavailable in this context. de error en el momento de la ejecución de la consulta.

  • Un UDF escalar no puede ser inlineado mediante bloque de expresión cuando:

  • Un UDF escalar no puede ser inlinizado mediante inlining escalar UDF en las siguientes condiciones. Para más información, véase Inlining of scalar UDF.

    • Un UDF escalar no puede ser inlineado mediante inlining escalar UDF cuando el cuerpo escalar de la UDF contiene WHILE loop BREAK o CONTINUE sentencia.
    • Un UDF escalar no puede ser inlineado mediante inlining escalar de UDF cuando el cuerpo escalar de la UDF contiene múltiples RETURN sentencias.
    • Un UDF escalar no puede ser inlineado mediante inlining escalar UDF cuando el cuerpo escalar de UDF contiene una función incorporada dependiente del tiempo, como GETDATE(). Para más información, vea Funciones deterministas y no deterministas.
    • Una UDF escalar no puede ser inlineada mediante inlining escalar UDF cuando el cuerpo escalar de la UDF contiene la función STRING_AGG, la función JSON_ARRAYAGG u otras funciones del sistema.
  • Puedes anidar funciones definidas por el usuario. Es decir, una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando la función llamada comienza su ejecución, y disminuye cuando la función llamada termina de ejecución. En Fabric Data Warehouse, puedes anidar funciones definidas por el usuario hasta cuatro niveles cuando un cuerpo UDF hace referencia a una tabla, vista o función de tabla en línea, o hasta 32 niveles en otros casos. Si superas los niveles máximos de anidamiento, la cadena de funciones que llama falla.

  • Para obtener más información, consulte Requisitos de inserción de UDF escalares.

  • Un UDF escalar no puede usarse en todas las formas de consulta, dependiendo de qué técnica de inlining sea aplicable.

    • Para el inlining escalar de UDF:
      • Un UDF escalar no puede usarse en GROUP BY y ORDER BY.
      • Un UDF escalar no puede usarse en combinación con CTE.
      • Una consulta de usuario puede fallar si se realizan más de 10 llamadas UDF en una sola consulta.
  • En Fabric Data Warehouse, una UDF escalar no puede usarse en ROLLUP, CUBE, o GROUPING SETS.

Advertencia

Si una consulta contiene múltiples UDFs escalares y al menos una depende del inlining UDF escalar, toda la consulta debe cumplir con los requisitos de inlining escalar de UDF.

Ejemplos

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

El siguiente ejemplo crea una función en línea con valores de tabla que devuelve información clave sobre módulos, filtrando por el objectType parámetro. Incluye un valor por defecto para devolver todos los módulos cuando llamas a la función con el DEFAULT parámetro. Este ejemplo utiliza 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

Llama a la función para devolver todas las funciones en línea con valores en tabla (IF):

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

Este ejemplo sencillo utiliza el TVF en línea creado previamente para demostrar cómo puedes combinar sus resultados con otras tablas usando CROSS APPLY. Aquí, seleccionas todas las columnas de ambos sys.objects y los resultados de ModulesByType para todas las filas que coinciden en la type columna. Para más información sobre el uso APPLYde , véase la 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.

Sugerencia

Para la sintaxis en Fabric Data Warehouse, véase la versión de CREATE FUNCTION for Fabric Data Warehouse.

  • 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.

    Utiliza esta frase para crear una rutina reutilizable que puedas emplear de estas maneras:

  • 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

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 las funciones deben seguir las reglas de los identificadores y ser únicos dentro de la base de datos y su esquema.

Nota

Debes incluir paréntesis después del nombre de la función aunque no especifiques un parámetro.

@ parameter_name

Parámetro de la función definida por el usuario. Puedes declarar uno o más parámetros.

Una función puede tener hasta 2.100 parámetros. Cuando un usuario o aplicación llama a una función, se debe proporcionar el valor de cada parámetro declarado a menos que se defina un valor predeterminado para dicho parámetro.

Especifique un nombre de parámetro con una arroba ( @ ) como primer carácter. El nombre del parámetro debe seguir las reglas de identificadores. Los parámetros son locales a la función; Puedes usar los mismos nombres de parámetros en otras funciones. Los parámetros solo pueden sustituir constantes; No pueden usarse en lugar de nombres de tablas, 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 por lotes. Por ejemplo, si defines una variable como char(3) y luego la asignas a un valor mayor que tres caracteres, los datos se truncan al tamaño definido y la INSERT instrucción o UPDATE tiene éxito.

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 dato de marca de tiempo (rowversion) no es un tipo soportado.

[ = predeterminado ]

Valor predeterminado del parámetro. Si defines un valor por defecto , puedes ejecutar la función sin especificar un valor para ese parámetro.

Cuando un parámetro de la función tiene un valor por defecto, debes especificar la palabra clave DEFAULT al llamar a la función para recuperar el valor por defecto. 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 dedata de la marca/ no es un tipo soportado. No se permiten los tipos no escalares de cursor y tabla.

function_body

Serie de instrucciones de Transact-SQL. El function_body no puede contener una SELECT sentencia ni referenciar datos de la base de datos. La function_body no puede consultar tablas ni vistas. El cuerpo de funciones puede llamar a otras funciones deterministas, pero no puede llamar 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 en línea con valores de tablas, no existe cuerpo de funciones; la tabla es el conjunto de resultados de una única SELECT afirmación.

TABLE

Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solo puedes pasar constantes y @local_variables a TVFs.

En los TVF en línea (previsualización), defines el TABLE valor de retorno mediante una sola SELECT sentencia. Las funciones en línea no tienen variables de retorno 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 especificas SCHEMABINDING, no puedes modificar los objetos subyacentes (como una vista o una tabla, por ejemplo) de una manera que afecte a la definición de la función. Primero debes modificar o eliminar la definición de función para eliminar dependencias del objeto que quieres 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:

  • Dejas la función.

  • ALTER usas la declaración de función y eliminas la SCHEMABINDING opción.

Solo puedes asignar un esquema a una función si se cumplen las siguientes condiciones:

  • Cualquier función definida por el usuario a la que la función haga referencia también está limitada al esquema.

  • Las referencias de funciones utilizan nombres de una o dos partes.

  • Dentro del cuerpo de UDFs, solo puedes referenciar funciones integradas y otros UDFs en la misma base de datos.

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

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 especificas este atributo, CALLED ON NULL INPUT está implícito por defecto, y el cuerpo de la función se ejecuta incluso si NULL se pasa como argumento.

procedimientos recomendados

Si no creas una función definida por el usuario con la cláusula SCHEMABIND, los cambios en los objetos subyacentes pueden afectar la definición de la función y causar resultados inesperados cuando la invoques. Especifica la WITH SCHEMABINDING cláusula cuando crees la función. Esta cláusula asegura que no puedas modificar los objetos referenciados en la definición de función a menos que también modifiques la función.

Interoperabilidad

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

  • Instrucciones de asignación.

  • Sentencias de control de flujo, excepto INTENTAR... Declaraciones CATCH.

  • Sentencias DECLARE que definen variables de datos locales.

En una función de valores de tabla en línea (previsualización), solo puedes usar una única sentencia select.

Limitaciones

No puedes usar funciones definidas por el usuario para realizar acciones que modifiquen el estado de la base de datos.

Puedes anidar funciones definidas por el usuario. Una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando la función llamada comienza su ejecución, y disminuye cuando la función llamada termina de ejecución. Si superas los niveles máximos de anidamiento, toda la cadena de funciones de llamada falla.

No puedes crear objetos, incluidas funciones, en la master base de datos de tu pool SQL serverless 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

Requiere CREATE FUNCTION permiso en la base de datos y permiso ALTER sobre el esquema en el que se está creando 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 dato int como entrada y devuelve un tipo de dato 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 pools SQL serverless.

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

El siguiente ejemplo crea una función en línea con valores de tabla que devuelve información clave sobre módulos, filtrando por el objectType parámetro. Incluye un valor por defecto para devolver todos los módulos cuando llamas a la función con el DEFAULT parámetro. Este ejemplo utiliza 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

Puedes llamar a la función para devolver todos los objetos de vista (V) con:

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

Nota

Las funciones de valor de tabla en línea están disponibles en pools SQL serverless, pero en versión previa en pools SQL dedicados.

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

Este ejemplo sencillo utiliza el TVF en línea creado previamente para demostrar cómo puedes combinar sus resultados con otras tablas usando CROSS APPLY. En este ejemplo, seleccionas todas las columnas tanto de sys.objects como de los resultados de ModulesByType para todas las filas que coinciden en la type columna. Para más información sobre el uso APPLYde , véase la 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 valor de tabla en línea están disponibles en pools SQL serverless, pero en versión previa en pools SQL dedicados.

Paso siguiente