Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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, yDELETE. - 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/ELSEyBEGIN/ENDbloques) - Variables locales
- Llamadas a funciones SQL integradas disponibles
- Llamadas a otras UDF
-
SELECTinstrucciones y referencias a tablas, vistas y funciones con valores de tabla insertados - Sentencias de flujo de control (
WHILEbucles,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.
Tú
ALTERusas la declaración de función y eliminas laSCHEMABINDINGopció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 FUNCTIONinstrucció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 SCHEMABINDINGcuá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 ... FROMconsulta 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...CATCHyGOTOsentencias. -
DECLAREsentencias 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
0significa que la UDF no es inlineable. - Un valor de
1indica que la UDF es elegible para la inlining Scalar UDF. - Un valor de
2significa que la UDF es elegible para inlining mediante bloque de Expresión. - Un valor de
3significa 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 inlineado mediante bloque de expresión cuando el cuerpo escalar del UDF contiene referencia a tablas/vistas/iTVFs.
- Un UDF escalar no puede ser inlineado mediante bloque de expresión cuando el cuerpo escalar del UDF contiene referencia a los mismos u otros UDF escalares.
- Un UDF escalar no puede ser inlineado mediante bloque de expresión cuando el cuerpo escalar del UDF contiene una función incorporada dependiente del tiempo como
GETDATE(). Para más información, vea Funciones deterministas y no deterministas. - Un UDF escalar no puede ser inlineado mediante bloque de expresión cuando el cuerpo escalar del UDF contiene funciones de IA, funciones agregadas, la función JSON_ARRAYAGG, funciones de metadatos, funciones de seguridad u otras funciones del sistema.
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
WHILEloopBREAKoCONTINUEsentencia. - Un UDF escalar no puede ser inlineado mediante inlining escalar de UDF cuando el cuerpo escalar de la UDF contiene múltiples
RETURNsentencias. - 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.
- Un UDF escalar no puede ser inlineado mediante inlining escalar UDF cuando el cuerpo escalar de la UDF contiene
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 BYyORDER 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.
- Un UDF escalar no puede usarse en
- Para el inlining escalar de UDF:
En Fabric Data Warehouse, una UDF escalar no puede usarse en
ROLLUP,CUBE, oGROUPING 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';
Contenido relacionado
Se aplica a:Azure Synapse Analytics
Analytics 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 FUNCTIONpuede 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 FUNCTIONpuede 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
SELECTEn 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.
Tú
ALTERusas la declaración de función y eliminas laSCHEMABINDINGopció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 FUNCTIONinstrucció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.