Sie sind auf Seite 1von 13

INTRODUCCION A LA PROGRAMACIN 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 smbolo @.
Sintaxis:
DECLARE @nombre_variable DATA_TYPE
Por ejemplo para declarar una variable que contendr 4 caracteres, el comando podra 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 construccin 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 tcnicas como el ciclo, o
condicionales. Estas tcnicas son similares a las encontradas en lenguajes de programacin tales como Visual
Basic o C++.

Cuando usted ejecuta un programa, las sentencias son ejecutadas secuencialmente. Para controlar la ejecucin
del flujo del programa se usan las sentencias de control.
TS-SQL permite controlar el flujo de ejecucin y almacenar procedimientos, a continuacin se revisarn 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


}

RETURN: Sintaxis:
RETURN [expresin entera]
Se puede utilizar en cualquier punto para salir de un
bloque T-SQL o de un procedimiento almacenado. La expresin entera especifica un valor entero que se
Las instrucciones despus del RETURN, no se retorna. Por defecto, todos los procedimientos
ejecutan. almacenados del sistema retornan un zero o non-
zero para indicar que la ejecucin fue exitosa o no.

GOTO: Sintaxis:
GOTO etiqueta
Se utiliza para cambiar el flujo de ejecucin a una
ubicacin especificada (label). Las sentencias El nombre de la etiqueta debe seguir las reglas de los
despus del GOTO son saltadas. Se pueden utilizar nombres de identificadores. procedimientos
mltiples saltos. almacenados del sistema retornan un zero o non-
zero para indicar que la ejecucin fue exitosa o no.

WHILE: Sintaxis:
WHILE condicin
Se pueden ejecutar una sentencia o un bloque de { Sentencias | bloque de sentencias}
sentencias basados en una condicin. Las [BREAK]
sentencias son ejecutadas repetidamente mientras
que la condicin especificada sea verdadera. Se { Sentencias | bloque de sentencias}
utiliza CONTINUE y BREAK para controlar la [CONTINUE]
ejecucin de la sentencias.
break: rompe el ciclo al bloque inmediatamente
externo.
Continue: Reinicia el loop.

IF ELSE: Sintaxis:
IF condicin
Se pueden ejecutar una sentencia o un bloque de { Sentencias | bloque de sentencias}
sentencias basados en una condicin. Las ELSE
sentencias son ejecutadas si la condicin se cumple,
en caso contrario se ejecutan las sentencias { Sentencias | bloque de sentencias}
especificadas despus del ELSE. No hay lmites en el uso de IF anidados

CASE: Sintaxis:
CASE
Permite retornar un valor basado en de sentencias WHEN condicin THEN expresiones
basados en una condicin. Las sentencias son [ WHEN condicin2 THEN expresiones]
ejecutadas si la condicin se cumple, en caso
contrario se ejecutan las sentencias especificadas [ ELSE]]
despus del ELSE. END

WAITFOR : Sintaxis:

Se puede especificar un tiempo, intervalo de tiempo, WAITFOR { DELAY tiempo | TIME tiempo
o evento que genera la ejecucin de un bloque de
sentencias, procedimiento almacenado o transaccin.
Delay: Detiene el procesamiento el tiempo
especificado.
Time: Especifica en qu momento se ejecuta.
PROCEDIMIENTOS ALMACENADOS

Un procedimiento almacenado (stored procedure) no es ms que una coleccin de sentencias Transact-SQL que
se constituye como si de una funcin de un lenguaje estructurado(C, Pascal) se tratase. Es decir, es posible
llamarlo mediante un identificador, puede recibir argumentos y devolver un valor de retorno.
La caracterstica primordial de los procedimientos almacenados es que se optimizan en el momento de su
creacin. Esto supone que, a diferencia de lo que sucede con las sentencias SQL que se envan al gestor de
manera interactiva, los procedimientos almacenados pasan previamente por un proceso de normalizacin.

Cuando se crea un procedimiento almacenado el procesador de consultas del gestor crea una versin del mismo
con una cierta estructura normalizada, y la almacena en una de las tablas del sistema. Las siguientes ejecuciones
de dicho procedimiento, no necesitarn consumir el tiempo necesario para llevar a cabo este proceso de
normalizacin, con lo que su ejecucin ser ms rpida.

Por otra parte, cuando el procedimiento se ejecuta por primera vez, se produce su compilacin y la optimizacin
del acceso del procedimiento a los datos. Este proceso optimizado y compilado, denominado plan, se mantiene en
memoria, en la cache de procedimientos, para posteriores ejecuciones con el consiguiente ahorro adicional de
tiempo y recursos.

Caractersticas bsicas

De manera anloga a las funciones de lenguaje estructurado, aceptan parmetros.


Devuelven un valor de retorno. Puede indicar si las cosas han funcionado correctamente o ser utilizado
por otro procedimiento.
Pueden estar anidados, es decir puede que un procedimiento llame a otro en su interior.
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.
Pueden ser de dos tipos: Permanentes o Temporales.
Pueden clasificarse en procedimientos del sistema y definidos por el usuario.

Procedimientos almacenados definidos por el usuario

Se utiliza la sentencia CREATE PROCEDURE. Todos los procedimientos almacenados son creados en la base de
datos actual, para crear el procedimiento se requiere tener permisos de ejecucin de procedimientos almacenados.

Sintaxis:
CREATE PROC[EDURE] nombre_procedimiento

Un procedimiento almacenado que muestre los detalles de un producto, podra ser:


Ubicacin 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 excepcin de: DEFAULTS, RULES; TRIGGERS y
VIEWS.
Se pueden incluir referencias temporales a tablas temporales.
Se pueden tener cerca de 2100 parmetros para un procedimiento.
Se pueden crear tantas variables locales como la memoria del equipo lo permita.
El tamao mximo para un procedimiento almacenado es 128 MB.

Para ejecutar el procedimiento se utiliza la sentencia EXECUTE.

Sintaxis:

EXEC[UTE] nombre_procedimiento

Para ejecutar el procedimiento creado en el ejemplo anterior se utilizara:

EXEC Productos_silla

Se pueden utilizar parmetros dentro del procedimiento para recibir o retornar valores.

Sintaxis:
CREATE PROCEDURE nombre_procedimiento
@nombre_parametro tipo_dato
AS
Por ejemplo, para utilizar un procedimiento que nos muestre los datos de los productos con determinado nombre,
se enviara como parmetro el nombre del producto As:

Procedimiento Almacenados extendidos

Se pueden ejecutar comandos del sistema operativo a travs de XP_cmdshell, su estructura es:
EXEC xp_cmdshell 'comando del S.O. ', no_output

Use master
Declare @datos int
EXEC @datos = xp_cmdshell ' dir *.exe'
If (@datos = 0)
PRINT 'Comando ejecutado con xito'
ELSE
PRINT 'Fallo al ejecutar el comando'

Funciones en Transact SQL*

*Tomado de: www.devjoker.com


Tutorial-de-Transact-SQL
SQL Server proporciona al usuario la posibilidad de definir sus propias funciones,
conocidas como UDF (user defined functions). Existen tres tipos de funciones. Estas son:

Funciones escalares.

Funciones en lnea.

Funciones en lnea de mltiples 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 funcin escalar es la siguiente:


CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>

-- Lista de parmetros

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

)
-- Tipo de datos que devuelve la funcin.

RETURNS <Function_Data_Type, ,int>

AS

BEGIN

...

END

El siguiente ejemplo muestra como crear una funcin 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 funcin escalar debemos identificar el nombre
de la funcin con el propietario de la misma.

El siguiente ejemplo muestra como utilizar la funcin anteriormente creada en


una sentencia Transact SQL. Un aspecto muy a tener en cuenta es que la
funcin 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 funcin 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 parmetros 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 eecucin de una sentencia SELECT.

La sintaxis para una funcin de tabla en linea es la siguiente:

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName>

-- Lista de parmetros

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

RETURNS TABLE

AS

RETURN

-- Sentencia Transact SQL

El siguiente ejemplo muestra como crear una funcin 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 funcin el lnea.

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 lnea de multiples sentencias


Las funciones en lnea de multiples sentencias son similares a las funciones en lnea
excepto que el conjunto de resultados que devuelven puede estar compuesto por la
ejecucin de varios consultas SELECT.

Este tipo de funcin se usa en situaciones donde se requiere una mayor lgica de
proceso.

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

CREATE FUNCTION <Table_Function_Name, sysname, FunctionName>

-- Lista de parmetros

<@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 lgica 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 funcin:

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

Das könnte Ihnen auch gefallen