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.
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. Los UDF escalares que no son inlineables funcionan 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 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 instrucciones Transact-SQL, como
SELECT - En Transact-SQL instrucciones de manipulación de datos (DML), como
UPDATE,INSERTyDELETE - 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
Puedes especificar CREATE OR ALTER FUNCTION la creación de 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>::=
{
[ 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.
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 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, no se soportan las INLINEpalabras clave , ENCRYPTION, y EXECUTE AS .
Las opciones de función soportadas incluyen:
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
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 obtener más información, vea Inserción de UDF escalares.
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
Las siguientes instrucciones son válidas en una función con valores escalares:
- Instrucciones de asignación
- Instrucciones control-of-Flow excepto
TRY...CATCHinstrucciones -
DECLAREinstrucciones 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 ... FROMtabla de usuario cuando:- El cuerpo UDF contiene una llamada a funciones incorporadas no deterministas (como
GETDATE()), véase Funciones deterministas y no deterministas. - El órgano de la UDF contiene
BREAKnuestraCONTINUEdeclaración. - Existe una llamada escalar recursiva a la UDF.
- El cuerpo UDF contiene una llamada a funciones incorporadas no deterministas (como
Un UDF escalar no puede usarse en todas las formas de consulta, como las CTEs y
GROUP BY, si:- La UDF escalar contiene cualquiera de estos tipos de datos como parámetro de entrada, variable local o tipo de devolución de datos: varchar(max),nvarchar(max), varbinary(max), binary(max).
- El cuerpo escalar de la UDF contiene llamadas a otras UDF escalares.
- El cuerpo escalar UDF contiene referencias a tablas/vistas/iTVF.
Para obtener más información, consulte Requisitos de inserción de UDF escalares.
Si un UDF escalar contiene cualquiera de los siguientes elementos, una consulta de usuario puede fallar si se realizan más de 10 llamadas a 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.
- La UDF escalar contiene cualquiera de estos tipos de datos como parámetro de entrada, variable local o tipo de devolución de datos: varchar(max),nvarchar(max), varbinary(max), binary(max).
- El cuerpo escalar de la UDF contiene llamadas a otras UDF escalares.
- El cuerpo escalar UDF contiene referencias a tablas/vistas/iTVF.
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.
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. 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.
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.
Inserción de 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. 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 proviene de comprobar la sintaxis dentro de la definición de la UDF. El UDF escalar no se inlinja antes del momento 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 ser inlineada mediante bloque de expresión. - Un valor de
3significa que UDF es elegible para cualquiera de las técnicas de inlining.
Si un UDF escalar es inlineable, no garantiza que siempre esté en línea cuando se compila la consulta.
Fabric Data Warehouse decide (por consulta) qué técnica de inlining aplicar.
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. 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
La función escalar definida por el usuario no dbo.custom_SYSUTCDATETIME es inlineable debido al uso de una función del sistema no determinante, 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';
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 marcade tiempo de la rowversion/ 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.