InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial de Transact SQL
Introducción a Transact SQL
Programación con Transact SQL
Fundamentos de Transact SQL
Tipos de datos en Transact SQL
Variables en Transact SQL
Equivalencia de datos de SQL Server y .NET
Operadores en Transact SQL
Estructuras de control en Transact SQL
Control de errores en Transact SQL
Consultar datos en Transact SQL
Consultas agregadas
Select FOR XML
Operaciones con conjuntos.
Insertar datos en Transact SQL
Actualizar datos en Transact SQL
Borrar datos en Transact SQL
Transacciones en Transact SQL
Procedimientos almacenados en Transact SQL
Funciones en Transact SQL
Funciones integradas de Transact SQL (I)
Triggers en Transact SQL
Cursores en Transact SQL
SQL dinámico en Transact SQL
También puedes ver ...
SET IDENTITY_INSERT ON y LinqToSQL
SQL Server 2008
LinQ To SQL - Un ejemplo sencillo
Formatear números en SQL Server
Leer un campo XML de SQL Server 2005 con C#
SQL dinámico en Transact SQL
Cursores en Transact SQL
Triggers en Transact SQL
Procedimientos almacenados en Transact SQL
Transacciones en Transact SQL

Afiliados
La Web del programador
MundoProgramacion


 

Funciones en Transact SQL

    SQL Server proporciona al usuario la posibilidad de definir sus propias funciones, conocidad como UDF (user defined functions). Exisiten tres tipos de funciones. Estas son:

  • Funciones escalares.
  • Funciones en línea.
  • Funciones en línea de multiples sentencias

Funciones escalares

    Las funciones escalares devuelven un único valor de cualquier tipo de los datos tal como int, money, varchar, real, etc.  

    La sintaxis para una función escalar es la siguiente:


CREATE
FUNCTION <Scalar_Function_Name, sysname, FunctionName>

(

-- Lista de parámetros

<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>, ...

)
-- Tipo de datos que devuelve la función.

RETURNS <Function_Data_Type, ,int>

AS

BEGIN

...

END

    El siguiente ejemplo muestra como crear una función escalar.


CREATE
FUNCTION fn_MultiplicaSaldo

(

@NumCuenta VARCHAR(20),

@Multiplicador DECIMAL(10,2)

)

RETURNS DECIMAL(10,2)

AS

BEGIN

DECLARE @Saldo DECIMAL(10,2),

@Return DECIMAL(10,2)

 

SELECT @Saldo = SALDO

FROM CUENTAS

WHERE NUMCUENTA = @NumCuenta

 

SET @Return = @Saldo * @Multiplicador

 

RETURN @Return

END

    Pueden ser utilizadas en cualquier sentencia Transact SQL. Un aspecto a tener en cuenta, es que para utilizar una función escalar debemos identificar el nombre de la función con el propietario de la misma.

    El siguiente ejemplo muestra como utilizar la función anteriormente creada en una sentencia Transact SQL. Un aspecto muy a tener en cuenta es que la función ejecutará sus sentencias SELECT una vez por cada fila del conjunto de resultados devuelto por la consulta SELECT principal.


SELECT
IDCUENTA,

NUMCUENTA,

SALDO,

FXALTA,

-- Ejecucion de la funcion:

dbo.fn_MultiplicaSaldo( NUMCUENTA, IDCUENTA) AS RESULTADO

FROM CUENTAS

    El siguiente ejemplo muestra como utilizar una función escalar en un script Transact SQL.


DECLARE
@NumCuenta VARCHAR(20),

@Resultado DECIMAL(10,2)

 

SET @NumCuenta = '200700000001'

SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 30.5)

 

PRINT @Resultado

    Las funciones escalares son muy similares a procedimientos almacenados con parámetros de salida, pero estas pueden ser utilizadas en consultas de seleccion y en la clausula where de las mismas.

    Las funciones no pueden ejecutar sentencias INSERT o UPDATE.

Funciones en linea

    Las funciones en linea son las funciones que devuelven un conjunto de resultados correspondientes a la eecución de una sentencia SELECT.

    La sintaxis para una función de tabla en linea es la siguiente:


CREATE
FUNCTION <Inline_Function_Name, sysname, FunctionName>

(

-- Lista de parámetros

<@param1, sysname, @p1> <Data_Type_For_Param1, , int>,...

)

RETURNS TABLE

AS

RETURN

(

-- Sentencia Transact SQL

)

    El siguiente ejemplo muestra como crear una función en linea.


CREATE
FUNCTION fn_MovimientosCuenta

(

@NumCuenta VARCHAR(20)

)

RETURNS TABLE

AS

RETURN

(

SELECT MOVIMIENTOS.*

FROM MOVIMIENTOS

INNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTA

WHERE CUENTAS.NUMCUENTA = @NumCuenta

)

    No podemos utilizar la clausula ORDER BY en la sentencia de una función el línea.

    Las funciones en linea pueden utilizarse dentro de joins o querys como si fueran una tabla normal.


SELECT
* FROM fn_MovimientosCuenta('200700000001')


SELECT
*

FROM CUENTAS

INNER JOIN CUENTAS_CLIENTE
ON CUENTAS_CLIENTE.IDCUENTA = CUENTAS.IDCUENTA

INNER JOIN CLIENTES
ON CLIENTES.id = CUENTAS_CLIENTE.IDCLIENTE

INNER JOIN fn_MovimientosCuenta('200700000001') A
ON A.IDCUENTA= CUENTAS.IDCUENTA

Funciones en línea de multiples sentencias

    Las funciones en línea de multiples sentencias son similares a las funciones en línea excepto que el conjunto de resultados que devuelven puede estar compuesto por la ejecución de varios consultas SELECT.

    Este tipo de función se usa en situaciones donde se requiere una mayor lógica de proceso.

    La sintaxis para una funciones de tabla de multi sentencias es la siguiente:


CREATE
FUNCTION <Table_Function_Name, sysname, FunctionName>

(

-- Lista de parámetros

<@param1, sysname, @p1> <data_type_for_param1, , int>, ...

)

RETURNS

-- variable de tipo tabla y su estructura

<@Table_Variable_Name, sysname, @Table_Var> TABLE

(

<Column_1, sysname, c1> <Data_Type_For_Column1, , int>,

<Column_2, sysname, c2> <Data_Type_For_Column2, , int>

)

AS

BEGIN

-- Sentencias que cargan de datos la tabla declarada

RETURN

END

    El siguiente ejemplo muestra el uso de una funcion de tabla de multi sentencias. 

 

/* Esta funcion busca la tres cuentas con mayor saldo

* y obtiene los tres últimos movimientos de cada una

* de estas cuentas

*/


CREATE
FUNCTION fn_CuentaMovimietos()

RETURNS @datos TABLE

( -- Estructura de la tabla que devuelve la funcion.

NumCuenta varchar(20),

Saldo decimal(10,2),

Saldo_anterior decimal(10,2),

Saldo_posterior decimal(10,2),

Importe_Movimiento decimal(10,2),

FxMovimiento datetime

)

AS

BEGIN

-- Variables necesarias para la lógica de la funcion.

DECLARE @idcuenta int,

@numcuenta varchar(20),

@saldo decimal(10,2)

 

-- Cursor con las 3 cuentas de mayor saldo

DECLARE CDATOS CURSOR FOR

SELECT TOP 3 IDCUENTA, NUMCUENTA, SALDO

FROM CUENTAS

ORDER BY SALDO DESC

 

OPEN CDATOS

FETCH CDATOS INTO @idcuenta, @numcuenta, @saldo

 

-- Recorremos el cursor

WHILE (@@FETCH_STATUS = 0)

BEGIN

-- Insertamos la cuenta en la variable de salida

INSERT INTO @datos

(NumCuenta, Saldo)

VALUES

(@numcuenta, @saldo)

-- Insertamos los tres últimos movimientos de la cuenta

INSERT INTO @datos

(Saldo_anterior, Saldo_posterior,
Importe_Movimiento
, FxMovimiento )

SELECT TOP 3

SALDO_ANTERIOR, SALDO_POSTERIOR,
IMPORTE
, FXMOVIMIENTO

FROM MOVIMIENTOS

WHERE IDCUENTA = @idcuenta

ORDER BY FXMOVIMIENTO DESC

-- Vamos a la siguiente cuenta

FETCH CDATOS INTO @idcuenta, @numcuenta, @saldo

END

 

CLOSE CDATOS;

DEALLOCATE CDATOS;

 

RETURN

END

    Para ejecutar la función:


select
* from fn_CuentaMovimietos()

    Y el resultado obtenido ...

NumCuenta    Saldo  Saldo_anterior  Saldo_posterior  Importe_Movimiento  FxMovimiento           
------------ ------ --------------- ---------------- ------------------- -----------------------
200700000002 500.00 NULL            NULL             NULL                NULL                  
NULL         NULL   550.00          500.00           50.00               2007-08-25 16:18:36.490
NULL         NULL   600.00          550.00           50.00               2007-08-23 16:20:41.183
NULL         NULL   600.00          550.00           50.00               2007-08-23 16:14:05.900
200700000001 100.99 NULL            NULL             NULL                NULL                  
NULL         NULL   50.99           100.99           50.00               2007-08-25 16:18:36.490
NULL         NULL   0.99            50.99            50.00               2007-08-23 16:20:41.183
NULL         NULL   50.99           0.99             50.00               2007-08-23 16:16:29.840

 


Inicio | Tutorial de Transact SQL Procedimientos almacenados en Transact SQLTutorial de Transact SQLFunciones integradas de Transact SQL (I) Versión para imprimir Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial de Transact SQL Procedimientos almacenados en Transact SQLTutorial de Transact SQLFunciones integradas de Transact SQL (I) Versión para imprimir

Funciones en Transact SQL
Autor: Pedro Herrarte Sánchez
Visitas: 17838 Fecha de publicación: 08/09/2007
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 43 | Comentarios: 0 | Archivo: Articulos
Visitas: 109 | Comentarios: 0 | Archivo: Articulos
Visitas: 155 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 33 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 285 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Basic .NET|C#
Visitas: 842 | Comentarios: 2 | Archivo: Articulos
Categorias: C#|ASP.NET|HTML DHTML|XML|JavaScript|ASP.NET|ASP|PHP|Visual Studio
Visitas: 712 | Comentarios: 1 | Archivo: Articulos
Categorias: Administración|Tutorial SQL
Visitas: 451 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 1054 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 250 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS

Útimos temas recibidos en los foros ...
FORMULARIO ACCESS por jcifuentes ... [Access] 11 29/05/2007
Ysmael por Ysmael ... [SQL] 0 08/01/2009
Reflection por Maurito22 ... [C#] 2 06/01/2009
Programador por Robert ... [ORACLE] 0 07/01/2009
como insertar registros en un formulario de visual basic.net desde la base de datos sql server por orlan ... [SQL Server] 8 09/06/2008
quierocodigo de autogenerado del seguro por edwin garcia ramirez ... [Visual Basic .NET] 0 07/01/2009
Video gratis sobre AJAX con ASP.NET por alexxe ... [ASP.NET] 1 06/01/2009
calcular saldo acumulativo por cben ... [SQL] 5 30/12/2008
comparar 2 campos de 2 tablas usando el like por nani ... [SQL Server] 1 06/01/2009
Apagar ordenador remoto en C# por victoryiyo ... [C#] 1 07/01/2009
numero de AUTOGENERADO IPSS por carlos ... [Visual Basic .NET] 5 30/10/2008
Como mandar mensaje a Celular por Pako ... [C#] 63 13/03/2007

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL
28/08/2006 Ubuntu en VmWare con VMware Tools
24/05/2007 Tipos de datos en Transact SQL    forma parte de...Tutorial de Transact SQL
28/06/2006 Propagacion de excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
03/10/2006 Estrcuturas de control.    forma parte de...Tutorial C#
08/03/2007 Cambiar el nombre del servidor SQL Server
14/07/2006 Tablas PL/SQL    forma parte de...Tutorial PL/SQL
04/11/2008 Fijar el encabezado de un GridView con ASP.Net y CSS
01/06/2006 Cursores de actualización en PL/SQL    forma parte de...Tutorial PL/SQL
04/03/2006 Bloques PL/SQL    forma parte de...Tutorial PL/SQL

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]