En SQL Server, una función con valores de tabla (TVF) es una función definida por el usuario que devuelve una tabla. Esto contrasta con una función escalar, que devuelve un solo valor.
Puede invocar una función con valores de tabla de la misma manera que puede consultar una tabla. Por ejemplo, puede usarlo en un SELECT
declaración. En algunos casos, las funciones con valores de tabla también se pueden usar para actualizar, eliminar e insertar datos.
Tipos de funciones con valores de tabla
Cuando crea una función con valores de tabla, tiene la opción de crear una función con valores de tabla de Transact-SQL o una función con valores de tabla de Common Language Runtime (CLR).
Funciones con valores de tabla de Transact-SQL
Los TVF de Transact-SQL pueden ser uno de los siguientes:
- Función con valores de tabla en línea (ITVF)
- Cuando creas un ITVF, inicias la definición de la función con
RETURNS TABLE
, y el subsiguienteSELECT
define la estructura de la tabla de retorno. - Función con valores de tabla de declaraciones múltiples (MSTVF)
- Una función con valores de tabla de varias declaraciones puede contener varias declaraciones, cuyos resultados se guardan en una variable que declara al comienzo de la función. Cuando hace esto, especifica explícitamente la estructura de la tabla de retorno.
Funciones con valores de tabla CLR
Desde la perspectiva de CLR, la sintaxis es similar a la ITVF de T-SQL, pero ligeramente diferente. Especifica explícitamente la estructura de la tabla de retorno, pero no declara una variable de retorno.
Las funciones con valores de tabla de CLR se implementan como métodos en una clase en un ensamblado de Microsoft .NET Framework.
Para obtener una descripción general más detallada de CLR TVF, consulte la documentación de Microsoft para CLR Table-Valued Functions.
Ejemplo 1:función con valores de tabla en línea
Este es un ejemplo del código T-SQL utilizado para crear una función con valores de tabla en línea.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Podemos decir que esta es una función con valores de tabla en línea, porque no especifica la estructura de la tabla de retorno. Simplemente indica RETURNS TABLE
, luego se basa en SELECT
instrucción para determinar la estructura de la tabla de retorno.
En este caso, la función requiere que se pase el nombre del gato como argumento.
Consulte Crear una función con valores de tabla en línea para ver ejemplos de cómo agregar opciones, como el enlace de esquema y el cifrado.
El enlace de esquema suele ser una buena idea, ya que evitará que se realicen cambios adversos en los objetos subyacentes a los que hace referencia la función.
Ejemplo 2:función con valores de tabla de declaraciones múltiples
Así es como escribiríamos la función si quisiéramos que fuera una función con valores de tabla de varias instrucciones.
CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
En este caso, usamos una variable de tipo tabla llamado @cats
y especificamos explícitamente la estructura de la tabla de retorno. Los resultados de la consulta se almacenan en esa variable, que luego se devuelve cuando se invoca la función.
Este ejemplo no le hace mucha justicia a MSTVF, porque solo incluyo una declaración. El punto principal de los MSTVF es que puede incluir varias declaraciones y puede agregar la salida de esas declaraciones a la variable de retorno.
Consulte Crear una función con valores de tabla de varias declaraciones para ver un ejemplo del uso de varias declaraciones, así como ejemplos de cómo agregar opciones como el enlace de esquema y el cifrado.
Ejemplo 3:seleccionar datos de nuestras funciones con valores de tabla
Entonces, ahora que hemos creado nuestras funciones, podemos invocarlas usando SELECT
declaración.
SELECT * FROM udf_CatsByName_ITVF('Tom'); SELECT * FROM udf_CatsByName_MSTVF('Tom');
Resultado:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected) +---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected)
Tanto ITVF como MSTVF se invocaron con la misma sintaxis y ambos devolvieron el mismo resultado.
Invocación de funciones con valores de tabla
Las funciones con valores de tabla se pueden invocar donde se permiten expresiones de tabla en FROM
cláusula de SELECT
, INSERT
, UPDATE
o DELETE
declaraciones.
Esto significa que puede seleccionar datos, insertar datos, actualizar datos e incluso eliminar datos a través de una función con valores de tabla.
Aquí hay artículos que demuestran cada uno:
- Seleccionar datos a través de una función con valores de tabla
- Actualizar datos a través de una función con valores de tabla
- Insertar datos a través de una función con valores de tabla
- Eliminar datos a través de una función con valores de tabla