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 ...
Simular TRUNC en SQL Server
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
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


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

 
chdoi por dj
Respuesta recibida el [26/05/2009 05:13:04]
muy buen tutorial, entendible y sin complicaciones

 
Super!! por Fatima
Respuesta recibida el [17/06/2009 11:23:35]
Este documento si que me esta sirviendo mucho!! esta muy completo en lo q respecta a las necesidades que tengo.

 
1A por Martin Bustamante
Respuesta recibida el [18/06/2009 12:46:09]
Este es mi lugar de consulta favorito

 
graxias por Dana
Respuesta recibida el [09/07/2009 07:38:19]
gracias eh, el tutorial esta clarisimo, me sirvio para lo q necesitaba hacer

 
Buen tutorial por superricagoku
Respuesta recibida el [13/07/2009 05:10:24]
Gracias por el tutorial, es bastante claro y es fácil de entender

 
Buena nota por Miguel González
Respuesta recibida el [08/09/2009 10:04:56]
Felicidades, el tutorial es claro y concreto, solo que tengo ciertas dudas de como extender algunas funcionalidad, no se si este medio sea el apropiado para hacerle llegar las mismas.

Muchas gracias

Miguel González
jmgoc76@gmail.com

 
Función Recursiva por TomYorke
Respuesta recibida el [06/10/2009 04:18:29]
como lo hago para utilizar mi funcion recursivamente, lo he intentado pero me da errores al utilizar if o while.

 
muy buen trabajo , esta muy bu... por Roger Bonilla
Respuesta recibida el [07/01/2010 09:27:50]
muy buen trabajo , esta muy buena la pagina todo el tutorial en si.....

 
Que buen aporte por Tony
Respuesta recibida el [18/02/2010 07:15:52]
es una muy buena página de consultas... gracias


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: 40217 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: 81 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 786 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 725 | Comentarios: 3 | Archivo: Articulos
Visitas: 3116 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14470 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1462 | Comentarios: 3 | Archivo: Articulos
Visitas: 688 | Comentarios: 2 | Archivo: Articulos
Visitas: 367 | Comentarios: 0 | Archivo: Articulos
Visitas: 1983 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 107 28/01/2010
Certificadoo por Francy ... [Actualidad] 0 10/03/2010
FORMULARIO ACCESS por jcifuentes ... [Access] 34 29/05/2007
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 119 12/01/2010
Certificado por Francy ... [Actualidad] 0 10/03/2010
certificado de pensión y ses antias por hernan ... [Actualidad] 0 10/03/2010
Certificado de Penciones Horizonte por orlandossa ... [Actualidad] 4 09/02/2010
fondo de pensiones por mafe ... [Access] 0 10/03/2010
certificado del fondo de pensiones cc 10.491.465 santander de Q. por carlos andres cifuentes banguero ... [Actualidad] 9 17/02/2010
certificado de semanas cotisadaz por lis ... [Actualidad] 0 10/03/2010
certificado por arme ... [Actualidad] 0 10/03/2010
Quiero saber a que fondo de pensiones estoy afiliada por clau ... [Actualidad] 169 24/07/2009

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 ...
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
26/03/2009 Manejador de archivos .js y .css para compresión y caché
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
22/10/2005 Introducción SQL    forma parte de...Tutorial SQL
28/08/2006 Ubuntu en VmWare con VMware Tools
17/10/2006 Excepciones personalizadas en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL
22/10/2005 Consultas combinadas. JOINS    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]