You are on page 1of 13

INTRODUCCION A LA PROGRAMACIÓN CON TRANSACT-SQL

Variables locales

Una variable es un objeto que puede tomar un valor. Se pueden utilizar variables locales para
introducir datos en una sentencia SQL. En T-SQL, se pueden crear variables locales para uso
temporal, mientras se ejecutan un bloque de sentencias SQL. Una vez la variable es declarada,
Una sentencia SQL puede establecer un valor para la variable. La siguiente sentencia en el
bloque puede recuperar el valor de la variable, y mostrar el resultado.
El nombre de una variable local debe tener como prefijo el símbolo ‘@’.
Sintaxis:
DECLARE @nombre_variable DATA_TYPE
Por ejemplo para declarar una variable que contendrá 4 caracteres, el comando podría ser
como sigue:
DECLARE @area Char(4)
Se puede utilizar la sentencia SET, o la sentencia SELECT para asignar un valor a una variable
declarada.
Sintaxis:
SET @nombre_variable = valor o SELECT @nombre_variable = value
Ej: DECLARE @area Char(4)
SET @area = ‘SUR2’ --Para asignar un valor a la variable
DECLARE @area Char(4)
SET @area = ‘SUR2’
SELECT * FROM clientes
WHERE codigo_area = @area
--Para usar la variable dentro de un Query.

ESTRUCTURAS DE CONTROL DE FLUJO

SQL Server provee la construcción de programas que le permitan actuar de forma selectiva sobre un grupo de
sentencias DML. Para realizar estas tareas, las estructuras de control de flujo usan técnicas como el ciclo, o
condicionales. Estas técnicas son similares a las encontradas en lenguajes de programación tales como Visual
Basic o C++.

Cuando usted ejecuta un programa, las sentencias son ejecutadas secuencialmente. Para controlar la ejecución
del flujo del programa se usan las ‘sentencias de control’.
TS-SQL permite controlar el flujo de ejecución y almacenar procedimientos, a continuación se revisarán las
principales estructuras:

 BEGIN … END: Sintaxis:

Se utilizan para marcar el comienzo y fin de un grupo BEGIN
de sentencias
T-SQL para ser ejecutadas como un simple bloque o
unidad. {

sentencia | bloque de sentencias

procedimiento almacenado o transacción. Las [BREAK] sentencias son ejecutadas repetidamente mientras que la condición especificada sea verdadera. . Las sentencias son [ WHEN condición2 THEN expresiones] ejecutadas si la condición se cumple.  WHILE: Sintaxis: WHILE condición Se pueden ejecutar una sentencia o un bloque de { Sentencias | bloque de sentencias} sentencias basados en una condición. intervalo de tiempo. Time: Especifica en qué momento se ejecuta. no se retorna. almacenados del sistema retornan un ‘zero’ o ‘non- zero’ para indicar que la ejecución fue exitosa o no. Las sentencias El nombre de la etiqueta debe seguir las reglas de los después del GOTO son saltadas. en caso contrario se ejecutan las sentencias { Sentencias | bloque de sentencias} especificadas después del ELSE. en caso contrario se ejecutan las sentencias especificadas [ ELSE]] después del ELSE. No hay límites en el uso de IF anidados  CASE: Sintaxis: CASE Permite retornar un valor basado en de sentencias WHEN condición THEN expresiones basados en una condición. Por defecto.  IF … ELSE: Sintaxis: IF condición Se pueden ejecutar una sentencia o un bloque de { Sentencias | bloque de sentencias} sentencias basados en una condición. END  WAITFOR : Sintaxis: Se puede especificar un tiempo.  GOTO: Sintaxis: GOTO etiqueta Se utiliza para cambiar el flujo de ejecución a una ubicación especificada (label). Delay: Detiene el procesamiento el tiempo especificado. todos los procedimientos ejecutan. Se { Sentencias | bloque de sentencias} utiliza CONTINUE y BREAK para controlar la [CONTINUE] ejecución de la sentencias. La expresión entera especifica un valor entero que se Las instrucciones después del RETURN. WAITFOR { DELAY tiempo | TIME tiempo o evento que genera la ejecución de un bloque de sentencias. almacenados del sistema retornan un ‘zero’ o ‘non- zero’ para indicar que la ejecución fue exitosa o no. Se pueden utilizar nombres de identificadores. procedimientos múltiples saltos. Las ELSE sentencias son ejecutadas si la condición se cumple. Continue: Reinicia el loop. break: rompe el ciclo al bloque inmediatamente externo. }  RETURN: Sintaxis: RETURN [expresión entera] Se puede utilizar en cualquier punto para salir de un bloque T-SQL o de un procedimiento almacenado.

para crear el procedimiento se requiere tener permisos de ejecución de procedimientos almacenados. Cuando se crea un procedimiento almacenado el procesador de consultas del gestor crea una versión del mismo con una cierta estructura normalizada. PROCEDIMIENTOS ALMACENADOS Un procedimiento almacenado (stored procedure) no es más que una colección de sentencias Transact-SQL que se constituye como si de una función de un lenguaje estructurado(C.  Pueden clasificarse en procedimientos del sistema y definidos por el usuario. Características básicas  De manera análoga a las funciones de lenguaje estructurado.  Pueden ser de dos tipos: Permanentes o Temporales.  Devuelven un valor de retorno. denominado plan. es decir puede que un procedimiento llame a otro en su interior. Pascal) se tratase. se mantiene en memoria. Puede indicar si las cosas han funcionado correctamente o ser utilizado por otro procedimiento. podría ser: . se produce su compilación y la optimización del acceso del procedimiento a los datos. para posteriores ejecuciones con el consiguiente ahorro adicional de tiempo y recursos. los procedimientos almacenados pasan previamente por un proceso de normalización. Por otra parte. La característica primordial de los procedimientos almacenados es que se optimizan en el momento de su creación. no necesitarán consumir el tiempo necesario para llevar a cabo este proceso de normalización. en la cache de procedimientos.  Pueden estar anidados. Las siguientes ejecuciones de dicho procedimiento.  Aspectos de seguridad: es posible que un usuario esté autorizado a ejecutar procedimientos almacenados aunque no tenga permiso de acceso directo a las tablas que son utilizadas en dicho procedimiento. puede recibir argumentos y devolver un valor de retorno. Esto supone que. aceptan parámetros. Este proceso optimizado y compilado. Sintaxis: CREATE PROC[EDURE] nombre_procedimiento Un procedimiento almacenado que muestre los detalles de un producto. es posible llamarlo mediante un identificador. a diferencia de lo que sucede con las sentencias SQL que se envían al gestor de manera interactiva. Procedimientos almacenados definidos por el usuario Se utiliza la sentencia CREATE PROCEDURE. cuando el procedimiento se ejecuta por primera vez. Es decir. con lo que su ejecución será más rápida. y la almacena en una de las tablas del sistema. Todos los procedimientos almacenados son creados en la base de datos actual.

 Se pueden tener cerca de 2100 parámetros para un procedimiento.  Se pueden crear tantas variables locales como la memoria del equipo lo permita. TRIGGERS y VIEWS.  Se pueden incluir referencias temporales a tablas temporales. Para ejecutar el procedimiento se utiliza la sentencia EXECUTE. Sintaxis: CREATE PROCEDURE nombre_procedimiento @nombre_parametro tipo_dato AS … .Ubicación deosl procedimiento en el Administrador de Sql server 2005: Se debe tener en cuenta lo siguiente:  El nombre debe seguir las reglas para identificadores  Se pueden crear objetos con los procedimientos a excepción de: DEFAULTS.  El tamaño máximo para un procedimiento almacenado es 128 MB. Sintaxis: EXEC[UTE] nombre_procedimiento Para ejecutar el procedimiento creado en el ejemplo anterior se utilizaría: EXEC Productos_silla Se pueden utilizar parámetros dentro del procedimiento para recibir o retornar valores. RULES.

varchar. Existen tres tipos de funciones.O. Funciones en línea de múltiples sentencias Funciones escalares Las funciones escalares devuelven un único valor de cualquier tipo de los datos tal como int.Por ejemplo. etc.com Tutorial-de-Transact-SQL SQL Server proporciona al usuario la posibilidad de definir sus propias funciones. La sintaxis para una función escalar es la siguiente: . no_output Use master Declare @datos int EXEC @datos = xp_cmdshell ' dir *. su estructura es: EXEC xp_cmdshell 'comando del S. Estas son: Funciones escalares. conocidas como UDF (user defined functions). para utilizar un procedimiento que nos muestre los datos de los productos con determinado nombre. money. real.exe' If (@datos = 0) PRINT 'Comando ejecutado con éxito' ELSE PRINT 'Fallo al ejecutar el comando' Funciones en Transact SQL* *Tomado de: www.devjoker. Funciones en línea. se enviaría como parámetro el nombre del producto Así: Procedimiento Almacenados extendidos Se pueden ejecutar comandos del sistema operativo a través de XP_cmdshell. '.

sysname.CREATE FUNCTION <Scalar_Function_Name..2) SELECT @Saldo = SALDO FROM CUENTAS WHERE NUMCUENTA = @NumCuenta . .. .Tipo de datos que devuelve la función.2). ..2) ) RETURNS DECIMAL(10. int>. @Return DECIMAL(10. @p1> <Data_Type_For_Param1.int> AS BEGIN .2) AS BEGIN DECLARE @Saldo DECIMAL(10.Lista de parámetros <@Param1. RETURNS <Function_Data_Type. CREATE FUNCTION fn_MultiplicaSaldo ( @NumCuenta VARCHAR(20). FunctionName> ( -.. END El siguiente ejemplo muestra como crear una función escalar. @Multiplicador DECIMAL(10. sysname. ) -.

2) SET @NumCuenta = '200700000001' SET @Resultado = dbo.fn_MultiplicaSaldo( NUMCUENTA. 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. pero estas pueden ser utilizadas en consultas de seleccion y en la clausula where de . NUMCUENTA. DECLARE @NumCuenta VARCHAR(20). 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. 30.Ejecucion de la funcion: dbo. SALDO.5) PRINT @Resultado Las funciones escalares son muy similares a procedimientos almacenados con parámetros de salida. FXALTA. -. IDCUENTA) AS RESULTADO FROM CUENTAS El siguiente ejemplo muestra como utilizar una función escalar en un script Transact SQL. @Resultado DECIMAL(10.fn_MultiplicaSaldo(@NumCuenta. SET @Return = @Saldo * @Multiplicador RETURN @Return END Pueden ser utilizadas en cualquier sentencia Transact SQL. Un aspecto a tener en cuenta. SELECT IDCUENTA.

sysname. @p1> <Data_Type_For_Param1.. ) RETURNS TABLE AS RETURN ( -. . FunctionName> ( -.las mismas. int>. Las funciones no pueden ejecutar sentencias INSERT o UPDATE. La sintaxis para una función de tabla en linea es la siguiente: CREATE FUNCTION <Inline_Function_Name.* ...Sentencia Transact SQL ) El siguiente ejemplo muestra como crear una función en linea. 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.Lista de parámetros <@param1. sysname. CREATE FUNCTION fn_MovimientosCuenta ( @NumCuenta VARCHAR(20) ) RETURNS TABLE AS RETURN ( SELECT MOVIMIENTOS.

Las funciones en linea pueden utilizarse dentro de joins o querys como si fueran una tabla normal.id = CUENTAS_CLIENTE. @p1> <data_type_for_param1. La sintaxis para una funciones de tabla de multi sentencias es la siguiente: CREATE FUNCTION <Table_Function_Name. int>. FROM MOVIMIENTOS INNER JOIN CUENTAS ON MOVIMIENTOS.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.IDCUENTA WHERE CUENTAS.Lista de parámetros <@param1. FunctionName> ( -. SELECT * FROM fn_MovimientosCuenta('200700000001') SELECT * FROM CUENTAS INNER JOIN CUENTAS_CLIENTE ON CUENTAS_CLIENTE.IDCUENTA = CUENTAS.NUMCUENTA = @NumCuenta ) No podemos utilizar la clausula ORDER BY en la sentencia de una función el línea.. Este tipo de función se usa en situaciones donde se requiere una mayor lógica de proceso.IDCUENTA= CUENTAS.IDCLIENTE INNER JOIN fn_MovimientosCuenta('200700000001') A ON A.IDCUENTA = CUENTAS. ) RETURNS . sysname.IDCUENTA INNER JOIN CLIENTES ON CLIENTES. sysname.. . .

@Table_Var> TABLE ( <Column_1. /* 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 ( -. Saldo_anterior decimal(10. sysname. int>. sysname.2). Saldo decimal(10.Estructura de la tabla que devuelve la funcion. FxMovimiento datetime . .2). NumCuenta varchar(20).variable de tipo tabla y su estructura <@Table_Variable_Name. Importe_Movimiento decimal(10. <Column_2. c1> <Data_Type_For_Column1. . sysname. c2> <Data_Type_For_Column2.2).Sentencias que cargan de datos la tabla declarada RETURN END El siguiente ejemplo muestra el uso de una funcion de tabla de multi sentencias.-. Saldo_posterior decimal(10.2). int> ) AS BEGIN -.

Insertamos los tres últimos movimientos de la cuenta INSERT INTO @datos .Cursor con las 3 cuentas de mayor saldo DECLARE CDATOS CURSOR FOR SELECT TOP 3 IDCUENTA.) AS BEGIN -.Insertamos la cuenta en la variable de salida INSERT INTO @datos (NumCuenta. Saldo) VALUES (@numcuenta. NUMCUENTA. SALDO FROM CUENTAS ORDER BY SALDO DESC OPEN CDATOS FETCH CDATOS INTO @idcuenta. @numcuenta varchar(20).Recorremos el cursor WHILE (@@FETCH_STATUS = 0) BEGIN -. @saldo -. DECLARE @idcuenta int. @saldo) -. @numcuenta.Variables necesarias para la lógica de la funcion. @saldo decimal(10.2) -.

99 0. (Saldo_anterior.-----.00 2007-08-25 16:18:36.840 .00 2007-08-23 16:20:41.183 NULL NULL 600. FxMovimiento ) SELECT TOP 3 SALDO_ANTERIOR.00 50.------------------- ----------------------- 200700000002 500.00 NULL NULL NULL NULL NULL NULL 550. @saldo END CLOSE CDATOS.--------------.00 550. ---------------. DEALLOCATE CDATOS..99 50.99 100.00 2007-08-23 16:20:41.00 50. IMPORTE.900 200700000001 100.99 NULL NULL NULL NULL NULL NULL 50.99 50.Vamos a la siguiente cuenta FETCH CDATOS INTO @idcuenta. RETURN END Para ejecutar la función: select * from fn_CuentaMovimietos() Y el resultado obtenido .490 NULL NULL 0.99 50.00 2007-08-25 16:18:36..00 2007-08-23 16:14:05.00 550.00 50. NumCuenta Saldo Saldo_anterior Saldo_posterior Importe_Movimiento FxMovimiento -----------.183 NULL NULL 50.00 500.490 NULL NULL 600.99 50. SALDO_POSTERIOR. FXMOVIMIENTO FROM MOVIMIENTOS WHERE IDCUENTA = @idcuenta ORDER BY FXMOVIMIENTO DESC -.00 2007-08-23 16:16:29. Importe_Movimiento. Saldo_posterior. @numcuenta.