sql >> Base de Datos >  >> RDS >> Sqlserver

Seleccionar datos a través de una función con valores de tabla en SQL Server

El SELECT es probablemente la declaración más utilizada en SQL Server. La mayoría de las veces, esta instrucción se ejecuta en una vista o directamente en una tabla para recuperar filas de datos tabulares.

Pero las vistas y las tablas no son los únicos objetos que puede ejecutar SELECT declaración sobre. El SELECT La declaración también se puede usar en otros objetos, como funciones de conjunto de filas, OPENXML y funciones definidas por el usuario.

Este artículo proporciona un ejemplo de selección de datos a través de una función con valores de tabla.

Ejemplo 1:función básica

Aquí hay una función rápida que selecciona datos básicos de una tabla a través de una función con valores de tabla en línea.

SELECT * FROM udf_Cats_ITVF();

Resultado:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 1       | Garfield  | 9871237654 |
| 2       | Felix     | 8871237651 |
| 3       | Tom       | 7871237652 |
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

La función se ve así:

CREATE FUNCTION dbo.udf_Cats_ITVF()
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    );
GO

Esta función simplemente selecciona todas las filas de una tabla. No se requieren argumentos.

Si desea seleccionar un gato determinado, debe agregar un WHERE cláusula.

SELECT * FROM udf_Cats_ITVF()
WHERE CatName = 'Fetch';

Resultado:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

Ahora tengo que admitir que esta función es un poco superflua, porque podríamos haber seleccionado los datos directamente de la tabla. O podríamos haber creado una vista para hacer el trabajo. Pero las funciones definidas por el usuario tienen un beneficio que las tablas y las vistas no tienen:parámetros.

Ejemplo 2:función con parámetros

Uno de los beneficios de las funciones con valores de tabla es que admiten parámetros. Aquí es donde la función se vuelve un poco más útil. Algunos se refieren a las funciones con valores de tabla como "vistas parametrizadas", porque se comportan como una vista pero con la funcionalidad adicional de permitir parámetros.

Entonces podríamos crear una variación de la función anterior para aceptar un argumento para el nombre del gato.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Resultado:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

La nueva función se ve así:

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Ejemplo 3:uniones

Las funciones con valores de tabla se pueden incluir en combinaciones.

Aquí, selecciono todas las columnas de una función con valores de tabla que devuelve todos los álbumes de un artista determinado:

SELECT * FROM ufn_AlbumsByArtist(1);

Resultado:

+------------+-------------------------+---------+
| ArtistId   | AlbumName               | Genre   |
|------------+-------------------------+---------|
| 1          | Powerslave              | Rock    |
| 1          | Somewhere in Time       | Rock    |
| 1          | Piece of Mind           | Rock    |
| 1          | Killers                 | Rock    |
| 1          | No Prayer for the Dying | Rock    |
+------------+-------------------------+---------+

El único problema con esta función es que no devuelve el nombre del artista. Si quiero el nombre del artista, necesito unirlo con la tabla que contiene esos datos. En este caso la tabla que contiene el nombre del artista se llama Artists , por lo que puedo modificar mi consulta de la siguiente manera:

SELECT  
    ar.ArtistName,
    aba.AlbumName,
    aba.Genre
FROM ufn_AlbumsByArtist(1) aba
INNER JOIN Artists ar
ON aba.ArtistId = ar.ArtistId;

Resultado:

+--------------+-------------------------+---------+
| ArtistName   | AlbumName               | Genre   |
|--------------+-------------------------+---------|
| Iron Maiden  | Powerslave              | Rock    |
| Iron Maiden  | Somewhere in Time       | Rock    |
| Iron Maiden  | Piece of Mind           | Rock    |
| Iron Maiden  | Killers                 | Rock    |
| Iron Maiden  | No Prayer for the Dying | Rock    |
+--------------+-------------------------+---------+