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 y Almacenamiento en Microsoft Fabric
CREATE FUNCTION
puede crear funciones de valores de tabla insertadas y funciones escalares.
Nota
Las UDF escalares son una característica en versión preliminar de Fabric Data Warehouse.
Importante
En Fabric Data Warehouse, las UDF escalares deben estar insertadas para su uso con SELECT ... FROM
consultas en tablas de usuario, pero todavía puede crear funciones que no se pueden insertar. UDF escalares que no son trabajos insertables en un número limitado de escenarios. Puede comprobar si se puede insertar una UDF.
Una función definida por el usuario es una rutina de Transact-SQL que acepta parámetros, realiza una acción, como un cálculo complejo, y devuelve el resultado de esa acción como un valor. Las funciones escalares devuelven un valor escalar, como un número o una cadena. Las funciones con valores de tabla (TVF) definidas por el usuario devuelven una tabla.
Use CREATE FUNCTION
para crear una rutina de T-SQL reutilizable que se pueda usar de estas maneras:
- En instrucciones Transact-SQL, como
SELECT
- En Transact-SQL instrucciones de manipulación de datos (DML), como
UPDATE
,INSERT
yDELETE
- En las aplicaciones que llaman a la función
- En la definición de otra función definida por el usuario
- Para reemplazar un procedimiento almacenado
Sugerencia
Puede especificar CREATE OR ALTER FUNCTION
para crear una nueva función si no existe por ese nombre, o modificar una función existente, en una sola instrucción.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de función escalar
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Sintaxis de función con valores de tabla insertada
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumentos
schema_name
Nombre del esquema al que pertenece la función definida por el usuario.
function_name
Nombre de la función definida por el usuario. Los nombres de funciones deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.
Nota
Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.
@ parameter_name
Parámetro de la función definida por el usuario. Es posible declarar uno o varios parámetros.
Una función puede tener un máximo de 2.100 parámetros. El usuario debe proporcionar el valor de cada parámetro declarado cuando se ejecuta la función, a menos que se defina un valor predeterminado para el parámetro.
Especifique un nombre de parámetro con una arroba ( @
) como primer carácter. El nombre del parámetro debe cumplir las mismas reglas para identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones. Los parámetros solamente pueden ocupar el lugar de constantes; no se pueden utilizar en lugar de nombres de tablas, nombres de columnas o nombres de otros objetos de base de datos.
Nota
ANSI_WARNINGS
no se respeta cuando se pasan parámetros en un procedimiento almacenado, una función definida por el usuario o cuando se declaran y establecen variables en una instrucción batch. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.
parameter_data_type
Tipo de datos de parámetro. Para Transact-SQL funciones, se permiten todos los tipos de datos escalares admitidos .
[ = predeterminado ]
Valor predeterminado del parámetro. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.
Cuando un parámetro de la función tiene un valor predeterminado, se debe especificar la palabra DEFAULT
clave cuando se llama a la función para recuperar el valor predeterminado. Este comportamiento es distinto del uso de parámetros con valores predeterminados en los procedimientos almacenados, donde la omisión del parámetro implica especificar el valor predeterminado.
return_data_type
Valor devuelto de una función escalar definida por el usuario.
En el caso de las funciones de Fabric Data Warehouse, se permiten todos los tipos de datos, excepto lamarca de tiemporowversion/. No se permiten tipos no escalares, como la tabla .
function_body
Una serie de instrucciones Transact-SQL.
En las funciones escalares, function_body es una serie de instrucciones de Transact-SQL que se evalúan conjuntamente como un valor escalar, que puede incluir:
- Expresión de instrucción única
- Expresiones de varias instrucciones (
IF/THEN/ELSE
yBEGIN/END
bloques) - Variables locales
- Llamadas a funciones SQL integradas disponibles
- Llamadas a otras UDF
-
SELECT
instrucciones y referencias a tablas, vistas y funciones con valores de tabla insertados
scalar_expression
Especifica el valor escalar que devuelve la función escalar.
select_stmt
Instrucción única SELECT
que define el valor devuelto de una función insertada con valores de tabla. Para una función insertada con valores de tabla, no hay ningún cuerpo de función; la tabla es el conjunto de resultados de una sola SELECT
instrucción.
TABLA
Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solamente se pueden pasar constantes y @local_variables a las TVF.
En las TVF insertadas (versión preliminar), el valor devuelto TABLE se define a través de una sola SELECT
instrucción. Las funciones insertadas no tienen variables devueltas asociadas.
<function_option>
En Fabric Data Warehouse, no se admiten las INLINE
palabras clave , ENCRYPTION
y EXECUTE AS
.
Las opciones de función admitidas incluyen:
SCHEMABINDING
Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función. En primer lugar, se debe modificar o quitar la propia definición de la función para quitar las dependencias en el objeto que se va a modificar.
El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:
Se quita la función.
La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.
Una función se puede enlazar a esquema solamente si se cumplen las siguientes condiciones:
Las funciones definidas por el usuario a las que hace referencia la función también están enlazadas a esquema.
Se hace referencia a los objetos a los que hace referencia la función mediante un nombre de dos partes.
En el cuerpo de las funciones definidas por el usuario solo se puede hacer referencia a las funciones integradas y a otras funciones definidas por el usuario de la misma base de datos.
El usuario que ejecutó la
CREATE FUNCTION
instrucción tiene permiso REFERENCES en los objetos de base de datos a los que hace referencia la función.
Para quitar SCHEMABINDING, use ALTER
.
DEVUELVE NULL EN ENTRADA NULL | SE LLAMA A ON NULL INPUT (LLAMADA EN ENTRADA NULL)
Especifica el OnNULLCall
atributo de una función con valores escalares. Si no se especifica, CALLED ON NULL INPUT
está implícito de forma predeterminada y el cuerpo de la función se ejecuta incluso si NULL
se pasa como argumento.
procedimientos recomendados
Si no se crea una función definida por el usuario con el enlace de esquemas, los cambios realizados en los objetos subyacentes pueden afectar a la definición de la función y generar resultados inesperados cuando se invoca. Se recomienda especificar la
WITH SCHEMABINDING
cláusula al crear la función. Así se asegura de que no se pueden modificar los objetos a los que se hace referencia en la definición de la función a menos que también se modifique la función.Escribir las funciones definidas por el usuario para que sean insertables. Para obtener más información, vea Inserción de UDF escalares.
Interoperabilidad
Funciones definidas por el usuario con valores de tabla insertadas
En una función con valores de tabla insertados, solo se permite una sola instrucción select.
Funciones escalares definidas por el usuario
Las siguientes instrucciones son válidas en una función con valores escalares:
- Instrucciones de asignación
- Instrucciones control-of-Flow excepto
TRY...CATCH
instrucciones -
DECLARE
instrucciones que definen variables de datos locales
Las siguientes funciones integradas no se admiten en un cuerpo de función con valores escalares:
Las UDF escalares no se pueden usar en una consulta en una
SELECT ... FROM
tabla de usuario cuando:- El cuerpo de UDF contiene una llamada a una función integrada no determinista, vea Funciones deterministas y no deterministas.
- El cuerpo de UDF contiene una expresión de tabla común (CTE).
- El cuerpo de UDF contiene el cuerpo de UDF de varias instrucciones más allá de seis
IF
--THEN
ELSE
bloques. - El cuerpo de UDF contiene un BUCLE WHILE
- El cuerpo de la UDF no se puede insertar debido a otros motivos. Para obtener más información, consulte Requisitos de inserción de UDF escalares.
Las UDF escalares no se pueden usar en una consulta cuando:
- Se llama directamente a UDF en una
GROUP BY
cláusula . - Se llama directamente a UDF en una
ORDER BY
cláusula . - la consulta de llamada tiene una expresión de tabla común (CTE).
- Se llama directamente a UDF en una
No se admiten UDF escalares recursivas.
Una consulta de usuario puede producir un error si se realizan más de 10 llamadas UDF en una sola consulta.
En algunos casos perimetrales, la complejidad de la consulta de usuario y el cuerpo de UDF impide la inserción, en cuyo caso la UDF escalar no está insertada y se produce un error en la consulta del usuario.
Cuando se usa una UDF escalar en cualquier escenario no admitido, verá un mensaje de error "
Scalar UDF execution is currently unavailable in this context.
"
Limitaciones
Nota
Durante la versión preliminar actual, las limitaciones están sujetas a cambios.
Las funciones definidas por el usuario no se pueden utilizar para realizar acciones que modifican el estado de la base de datos.
Las funciones definidas por el usuario se pueden anidar; es decir, una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando se empieza a ejecutar la función llamada y disminuye cuando se termina de ejecutar la función llamada. Las funciones definidas por el usuario en Fabric Data Warehouse se pueden anidar hasta cuatro niveles cuando un cuerpo de UDF hace referencia a una función con valores de tabla,vista o en línea, o hasta 32 niveles en caso contrario. Si se superan los niveles máximos de anidamiento, se produce un error en la cadena de funciones que realiza la llamada.
Metadatos
En esta sección se enumeran las vistas de catálogo del sistema que se pueden usar para devolver metadatos sobre funciones definidas por el usuario.
sys.sql_modules: muestra la definición de Transact-SQL funciones definidas por el usuario. Por ejemplo:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');
sys.parameters: muestra información sobre los parámetros definidos en funciones definidas por el usuario.
sys.sql_expression_dependencies: muestra los objetos subyacentes a los que hace referencia una función.
Permisos
Los miembros de los roles Administrador, Miembro y Colaborador del área de trabajo de Fabric pueden crear funciones.
Inserción de UDF escalar
Microsoft Fabric Data Warehouse usa la inserción de UDF escalar para compilar y ejecutar código definido por el usuario de forma distribuida. La inserción de UDF escalar está habilitada de forma predeterminada.
Aunque la inserción escalar de UDF es una técnica de optimización del rendimiento introducida primero en Microsoft SQL Server 2019 (15.0), en Fabric Data Warehouse determina el conjunto admitido de escenarios. En Fabric Data Warehouse, las UDF escalares se transforman automáticamente en expresiones escalares o subconsultas escalares que se sustituyen en la consulta de llamada en lugar del operador UDF.
Algunas sintaxis de T-SQL hacen que una UDF escalar no se pueda insertar. Las funciones que contienen un WHILE
bucle, varias RETURN
instrucciones o una llamada a una función integrada de SQL no determinista (como GETUTCDATE()
o GETDATE()
) no se pueden insertar. Para obtener más información, consulte Requisitos de inserción de UDF escalares.
Comprobar si se puede insertar una UDF escalar
La sys.sql_modules
vista de catálogo incluye la columna is_inlineable
, que indica si una UDF es insertable.
La is_inlineable
propiedad se deriva de la comprobación de la sintaxis dentro de la definición de UDF. La UDF escalar no está insertada antes del tiempo de compilación. Un valor de 1
indica que la UDF es insertable, mientras que un valor de 0
indica que no es insertable. Si una UDF escalar es insertable, no garantiza que siempre se inserte cuando se compile la consulta.
Fabric Data Warehouse decide (por consulta) si se debe insertar una UDF, en función de la complejidad general de las consultas.
Use la siguiente consulta de ejemplo para comprobar si una UDF escalar es insertable:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
Si una función escalar no es insertable en sys.sql_modules.is_inlineable
, todavía puede ejecutar la consulta como una llamada independiente, por ejemplo, para establecer una variable. Pero la función escalar no puede formar parte de una SELECT ... FROM
consulta en una tabla de usuario. Por ejemplo:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
dbo.custom_SYSUTCDATETIME
La función escalar de ejemplo definida por el usuario no es insertable debido al uso de una función del sistema no determinante, SYSUTCDATETIME()
. Se producirá un error cuando se use en una consulta en una SELECT ... FROM
tabla de usuario, pero se realizará correctamente como una llamada independiente, por ejemplo:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Ejemplos
A Creación de una función alineada con valores de tabla
En el ejemplo siguiente se crea una función con valores de tabla insertados para devolver cierta información clave sobre los módulos, filtrando por el parámetro objectType
. Incluye un valor predeterminado para devolver todos los módulos cuando se llama a la función con el DEFAULT
parámetro . En este ejemplo se usan algunas de las vistas de catálogo del sistema mencionadas en Metadatos.
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
A continuación, se puede llamar a la función para devolver todas las funciones insertadas con valores de tabla (IF
) con:
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
O bien, busque todas las funciones escalares (FN
):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Combinación de resultados de una función con valores de tabla insertados
En este sencillo ejemplo se usa la función con valores de tabla insertados creada anteriormente para mostrar cómo se pueden combinar sus resultados con otras tablas mediante CROSS APPLY. Aquí, se seleccionan todas las columnas de y sys.objects
los resultados de ModulesByType
para todas las filas que coinciden en la type
columna. Para obtener más información sobre el uso de apply, vea CLÁUSULA FROM más JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Creación de una función UDF escalar
En el ejemplo siguiente se crea una UDF escalar insertable que enmascara un texto de entrada.
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
Puede llamar a la función de la siguiente manera:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Más ejemplos de cómo puede usar UDF escalares en Fabric Data Warehouse:
En una SELECT
instrucción :
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
En una WHERE
cláusula :
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
En una JOIN
cláusula :
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
En una ORDER BY
cláusula :
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
En instrucciones del lenguaje de manipulación de datos (DML) como INSERT
, UPDATE
o 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.
En Sistema de la plataforma de análisis (PDW), el valor devuelto debe ser un valor escalar (único).
En Azure Synapse Analytics,
CREATE FUNCTION
puede devolver una tabla mediante la sintaxis de las funciones con valores de tabla insertados (versión preliminar) o puede devolver un único valor mediante la sintaxis de las funciones escalares.En los grupos de SQL sin servidor de Azure Synapse Analytics,
CREATE FUNCTION
puede crear funciones de valores de tabla insertadas, pero no funciones escalares.Utilice esta instrucción para crear una rutina reutilizable que se pueda utilizar de estas formas:
En instrucciones Transact-SQL, como
SELECT
En las aplicaciones que llaman a la función
En la definición de otra función definida por el usuario
Para definir una restricción CHECK en una columna
Para reemplazar un procedimiento almacenado
Usar una función insertada como predicado de filtro de la directiva de seguridad
Sugerencia
Para ver la sintaxis de Fabric Data Warehouse, consulte la versión de CREATE FUNCTION para Microsoft Fabric Data Warehouse.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de función escalar
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Sintaxis de función con valores de tabla insertada
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumentos
schema_name
Nombre del esquema al que pertenece la función definida por el usuario.
function_name
Nombre de la función definida por el usuario. Los nombres de funciones deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.
Nota
Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.
@ parameter_name
Parámetro de la función definida por el usuario. Es posible declarar uno o varios parámetros.
Una función puede tener un máximo de 2.100 parámetros. El usuario debe proporcionar el valor de cada parámetro declarado cuando se ejecuta la función, a menos que se defina un valor predeterminado para el parámetro.
Especifique un nombre de parámetro con una arroba ( @
) como primer carácter. El nombre del parámetro debe cumplir las mismas reglas para identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones. Los parámetros solamente pueden ocupar el lugar de constantes; no se pueden utilizar en lugar de nombres de tablas, nombres de columnas o nombres de otros objetos de base de datos.
Nota
ANSI_WARNINGS
no se respeta cuando se pasan parámetros en un procedimiento almacenado, una función definida por el usuario o cuando se declaran y establecen variables en una instrucción batch. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.
parameter_data_type
Tipo de datos de parámetro. En las funciones de Transact-SQL, se permiten todos los tipos de datos escalares admitidos en Azure Synapse Analytics. El tipo de datos timestamp (rowversion) no es un tipo admitido.
[ = predeterminado ]
Valor predeterminado del parámetro. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.
Cuando un parámetro de la función tiene un valor predeterminado, se debe especificar la palabra clave DEFAULT al llamar a la función para recuperar el valor predeterminado. Este comportamiento es distinto del uso de parámetros con valores predeterminados en los procedimientos almacenados, donde la omisión del parámetro implica especificar el valor predeterminado.
return_data_type
Valor devuelto de una función escalar definida por el usuario. En las funciones de Transact-SQL, se permiten todos los tipos de datos escalares admitidos en Azure Synapse Analytics. El tipo de datos rowversion/timestamp no es un tipo admitido. No se permiten los tipos de datos no escalares de cursor y tabla.
function_body
Serie de instrucciones de Transact-SQL. El function_body no puede contener una SELECT
instrucción y no puede hacer referencia a datos de base de datos. El function_body no puede hacer referencia a tablas ni vistas. El cuerpo de la función puede llamar a otras funciones deterministas, pero no a funciones no deterministas.
En las funciones escalares, function_body es una serie de instrucciones de Transact-SQL que se evalúan como un valor escalar.
scalar_expression
Especifica el valor escalar que devuelve la función escalar.
select_stmt
Instrucción única SELECT
que define el valor devuelto de una función insertada con valores de tabla. Para una función insertada con valores de tabla, no hay ningún cuerpo de función; la tabla es el conjunto de resultados de una sola SELECT
instrucción.
TABLA
Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla. Solamente se pueden pasar constantes y @local_variables a las TVF.
En las TVF insertadas (versión preliminar), el valor devuelto TABLE se define a través de una sola SELECT
instrucción. Las funciones insertadas no tienen variables devueltas asociadas.
<function_option>
Especifica que la función tiene una o varias de las siguientes opciones.
SCHEMABINDING
Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función. En primer lugar, se debe modificar o quitar la propia definición de la función para quitar las dependencias en el objeto que se va a modificar.
El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:
Se quita la función.
La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.
Una función se puede enlazar a esquema solamente si se cumplen las siguientes condiciones:
Las funciones definidas por el usuario a las que hace referencia la función también están enlazadas a esquema.
Se hace referencia a las funciones y otras funciones definidas por el usuario a las que hace referencia la función mediante un nombre de una o dos partes.
En el cuerpo de las funciones definidas por el usuario solo se puede hacer referencia a las funciones integradas y a otras funciones definidas por el usuario de la misma base de datos.
El usuario que ejecutó la
CREATE FUNCTION
instrucción tiene permiso REFERENCES en los objetos de base de datos a los que hace referencia la función.
Para quitar SCHEMABINDING, use ALTER
.
DEVUELVE NULL EN ENTRADA NULL | SE LLAMA A ON NULL INPUT (LLAMADA EN ENTRADA NULL)
Especifica el OnNULLCall
atributo de una función con valores escalares. Si no se especifica, CALLED ON NULL INPUT
está implícito de forma predeterminada y el cuerpo de la función se ejecuta incluso si NULL
se pasa como argumento.
procedimientos recomendados
Si una función definida por el usuario no se crea con la cláusula SCHEMABINDING, los cambios que se realicen en los objetos subyacentes pueden afectar a la definición de la función y generar resultados inesperados al invocarla. Se recomienda especificar la WITH SCHEMABINDING
cláusula al crear la función. Así se asegura de que no se pueden modificar los objetos a los que se hace referencia en la definición de la función a menos que también se modifique la función.
Interoperabilidad
Las siguientes instrucciones son válidas en una función con valores escalares:
Instrucciones de asignación.
Instrucciones de control de flujo, excepto las instrucciones TRY...CATCH.
Instrucciones DECLARE que definen variables de datos locales.
En una función con valores de tabla insertados (versión preliminar), solo se permite una única instrucción SELECT.
Limitaciones
Las funciones definidas por el usuario no se pueden utilizar para realizar acciones que modifican el estado de la base de datos.
Las funciones definidas por el usuario se pueden anidar; es decir, una función definida por el usuario puede llamar a otra. El nivel de anidamiento aumenta cuando se empieza a ejecutar la función llamada y disminuye cuando se termina de ejecutar la función llamada. Si se superan los niveles máximos de anidamiento, la cadena completa de funciones de llamada produce un error. En Microsoft Fabric Data Warehouse, las funciones definidas por el usuario se pueden anidar hasta cinco niveles.
Los objetos, incluidas las funciones, no se pueden crear en la base de datos master
del grupo de SQL sin servidor en Azure Synapse Analytics.
Metadatos
En esta sección se enumeran las vistas de catálogo del sistema que se pueden usar para devolver metadatos sobre funciones definidas por el usuario.
sys.sql_modules: muestra la definición de Transact-SQL funciones definidas por el usuario. Por ejemplo:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');
sys.parameters: muestra información sobre los parámetros definidos en funciones definidas por el usuario.
sys.sql_expression_dependencies: muestra los objetos subyacentes a los que hace referencia una función.
Permisos
Se requiere el permiso CREATE FUNCTION en la base de datos y el permiso ALTER en el esquema en el que se va a crear la función.
Ejemplos
A Uso de una función definida por el usuario con valores escalares para cambiar un tipo de datos
Esta función simple toma un tipo de datos int como entrada y devuelve un tipo de datos decimal (10,2) como salida.
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
Nota
Las funciones escalares no están disponibles en los grupos de SQL sin servidor.
B. Creación de una función alineada con valores de tabla
En el ejemplo siguiente se crea una función con valores de tabla insertados para devolver cierta información clave sobre los módulos, filtrando por el parámetro objectType
. Incluye un valor predeterminado para devolver todos los módulos cuando se llama a la función con el DEFAULT
parámetro . En este ejemplo se usan algunas de las vistas de catálogo del sistema mencionadas en Metadatos.
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
A continuación, se puede llamar a la función para devolver todos los objetos de vista (V
) con:
select * from dbo.ModulesByType('V');
Nota
Las funciones de valores de tabla insertados están disponibles en los grupos de SQL sin servidor, pero en versión preliminar en los grupos de SQL dedicados.
C. Combinación de resultados de una función con valores de tabla insertados
En este sencillo ejemplo se usa la función con valores de tabla insertados creada anteriormente para mostrar cómo se pueden combinar sus resultados con otras tablas mediante CROSS APPLY. Aquí, se seleccionan todas las columnas de y sys.objects
los resultados de ModulesByType
para todas las filas que coinciden en la type
columna. Para obtener más información sobre el uso de apply, vea CLÁUSULA FROM más JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Nota
Las funciones de valores de tabla insertados están disponibles en los grupos de SQL sin servidor, pero en versión preliminar en los grupos de SQL dedicados.