Guia 2 SQL Server
Guia 2 SQL Server
Guia 2 SQL Server
GUÍA 2 Pág. 1
I. OBJETIVOS
II. INTRODUCCIÓN
Variables:
Las variables locales se identifican como aquellos objetos que comienzan con el
carácter arroba '@' una vez; las variables globales se identifican como los objetos que
tienen 2 arrobas al inicio '@@', como ejemplo de variables globales tenemos:
@@rowcount, @@error.
Construcción Descripción
IF..ELSE Define una decisión.
GOTO etiqueta Define un salto incondicional
WAITFOR Establece un tiempo para la ejecución
de una instrucción. El tiempo puede ser
un intervalo de retardo o un instante
especificado de ejecución (una hora
concreta del día)
WHILE Bucle básico de SQL
BREAK Acompaña al bucle WHILE y le indica
finalizarlo inmediatamente.
CONTINUE Acompaña al bucle WHILE y le indica
continuar con la siguiente iteración.
RETURN [n] Salida incondicional del procedimiento o
GUÍA 2 Pág. 2
proceso por lotes, se puede definir un
número entero como estado devuelto y
puede asignarse a cualquier variable.
BEGIN..END Utilizado en conjunto con IF..ELSE o
WHILE para agrupar un conjunto de
instrucciones.
CASE Implementada en la instrucción SELECT
y UPDATE y permite realizar consultas y
actualizaciones condicionales.
PRINT
Es una instrucción para imprimir un dato en la pantalla, la sintaxis es:
PRINT "cadena" ; cadena puede ser también una variable de tipo varchar.
RAISERROR
Es similar a PRINT, pero permite especificar un número de error y la severidad del
mensaje. RAISERROR también permite que los errores se registren en el servicio de
sucesos de Windows NT haciendo posible leerlos a través del visor de sucesos de
Windows NT.
La sintaxis es:
RAISERROR({id_mensaje | cadena_mensaje}, severidad, estado [,
argumento1 [,argumento2]]) WITH LOG.
Procedimientos almacenados.
Dos de las cuestiones más importantes para el usuario de bases de datos son la
velocidad y la eficiencia. Por ello surge una pregunta: ¿Cómo puedo proporcionar a los
usuarios la velocidad y eficiencia que necesitan y merecen?
GUÍA 2 Pág. 3
AS
INSTRUCCION SQL
Ejemplo 1
Instrucción SQL
USE AdventureWorks
Select name, Color, ListPrice, SellStartDate
FROM Production.Product
WHERE SellStartDate > '1/1/2003'
ORDER BY SellStartDate, Name
Para probar el nuevo procedimiento, abra una nueva consulta de SQL Server y
escriba y ejecute el código siguiente.
USE AdventureWorks
EXEC Production.ShowProduct
Nota: los procedimientos almacenados los puede encontrar en la base de datos
donde los trabaja, en la opción programación.
Ejemplo2:
--Obteniendo Ganancia sobre las ventas
CREATE PROC Ganancia_de_Venta
@id_Venta int, -- parametro de entrada
@id_Prod_bodega int, -- parametro de entrada
@ganancia decimal (8,2) OUTPUT -- parametro de salida
AS
declare @unidades int
GUÍA 2 Pág. 4
Reglas de procedimientos almacenados
Entre las reglas para la programación de procedimientos almacenados, cabe citar las
siguientes:
La propia definición CREATE PROCEDURE puede incluir cualquier número y
tipo de instrucciones SQL, excepto las siguientes instrucciones CREATE, que no
pueden ser utilizadas nunca dentro de un procedimiento almacenado:
CREATE DEFAULT CREATE TRIGGER
CREATE PROCEDURE CREATE VIEW
CREATE RULE
Se puede crear otros objetos de base de datos dentro de un procedimiento
almacenado. Puede hacer referencia a un objeto creado en el mismo
procedimiento almacenado, siempre que se cree antes de que se haga
referencia al objeto.
Puede hacer referencia a tablas temporales dentro de un procedimiento
almacenado.
Si ejecuta un procedimiento almacenado que llama a otro procedimiento
almacenado, el procedimiento al que se llama puede tener acceso a todos los
objetos creados por el primer procedimiento, incluidas las tablas temporales.
El número máximo de parámetros en un procedimiento almacenado es de 1,024.
El número máximo de variables locales en un procedimiento almacenado está
limitado únicamente por la memoria disponible.
Cursores
Una base de datos relaciona como SQL Server está orientada a conjuntos de manera
natural, por ejemplo una instrucción SELECT regresa un conjunto de datos; sin
embargo muchas veces es necesario utilizar no el enfoque de conjunto de datos sino de
registros para realizar ciertas operaciones no complejas, es donde se implementan los
cursores.
GUÍA 2 Pág. 5
Trabajar con cursores implica algunos pasos básicos como son el declararlos, abrirlos,
capturar filas en el cursor, opcionalmente se puede modificar o eliminar registros, luego
se debe cerrar el cursor y por ultimo retirarlo de la memoria.
IV. PROCEDIMIENTO
Definición.
Esta base de datos se desea para un almacén que tiene varios productos a la venta, los
cuales adquiere de varios proveedores. Un producto puede ser distribuido por varios
proveedores y un proveedor distribuye varios productos, como es una relación de
muchos a muchos se tiene una tercera tabla llamada "catalogo" donde se indica el
detalle del producto.
GUÍA 2 Pág. 6
adquiridos en una compra y maneja la política de vender primero los productos más
antiguos.
Para poder crear la base de datos anterior, deberá crear una base de datos con el
nombre almacen_carnet, y ejecute los scripts para generar las tablas que se listan a
continuación:
GUÍA 2 Pág. 7
constraint fk_idproveedor foreign key (idproveedor)
references proveedor(idproveedor),
constraint fk_idproducto foreign key (idproducto)
references producto(idproducto),
constraint u_prodcat unique (idproducto,idproveedor),
constraint ck_precio_catalogo check (precio>=0),
constraint ck_idprodcat_catalogo
check (idprodcat=idproducto+idproveedor)
)
Ejecute las siguientes instrucciones SQL para introducir datos a las tablas de trabajo:
GUÍA 2 Pág. 8
-- productos que ofrecen los proveedores
-- nuestros proveedores
En la tabla de catálogo, se generará un código para cada producto distribuido por cada
proveedor, dicho código se almacenará en el campo llamado 'idprodcat':
GUÍA 2 Pág. 9
Para insertar datos en la bodega, se creara un procedimiento almacenado que toma 5
parámetros de entrada los cuales son:
return(0)
error:
print 'No existe un producto en el catalogo'
return(1)
GO
Algunas características del procedimiento almacenado creado anteriormente son:
a) La línea declare @idprodcat char(16) esta declarando una variable local utilizada
dentro del SP (Store Procedure). No confundir una variable local con un
parámetro de entrada o de salida.
b) Para asignarle un valor a una variable se utiliza la sentencia SELECT seguido de
la consulta o valor que será almacenado en dicha variable. Por ejemplo:
GUÍA 2 Pág. 10
d) Si hubo error la sentencia print muestra el mensaje 'No existe un producto en el
catalogo', de lo contrario se insertan los datos.
begin tran
update bodega
set unidades = unidades - @unidades
where idprodbod = @idprodbod
commit tran
goto fin
errores:
rollback tran --se elimina la transaccion
fin:
print 'Bodega actualizada'
Por ultimo crearemos un procedimiento almacenado más sofisticado, que permita
agregar fácilmente las unidades de un producto a nuestra tabla detalleventa, los
parámetros a pasar deben ser: el id de la venta, el idprodcat (es decir el codigo del
GUÍA 2 Pág. 11
producto distribuido por un proveedor determinado) y las unidades vendidas. Además
dicho procedimiento llamara al SP actualizar_bodega.
Nuestro procedimiento almacenado consultará nuestra bodega para revisar las compras
que se han efectuado de ese producto, y como la política es vender el producto más
antiguo, se venderán los productos comprados en las fechas más antiguas.
select @existencia=sum(unidades)
from bodega
where idprodcat=@idprodcat
GUÍA 2 Pág. 12
insert into
detalleventa values(@idventa,@idprodbod,@unidades)
--actualizando bodega llamando al SP
EXEC sp_actualizar_bodega @idprodbod,@unidades
select @unidades=0
end
fetch next from ctmp into @idprodbod,@unidadestmp
end
close ctmp
deallocate ctmp
Observe que existen dos compras, una realizada el 1 de enero del 2000 por 5 unidades y otra realizada el
7 de enero del 2000 por 15 por lo que se tienen 20 unidades en total.
GUÍA 2 Pág. 13
Observe como se disminuyo en 4 el primer lote de compras. Suponga ahora que el
cliente 02 realiza una compra por 7 unidades del mismo producto:
-- se registra primero la venta del cliente 02
insert into venta
values ('28/03/2001','clie0002')
Se puede observar, del primer lote de compras ya no hay existencia, mientras que del
segundo se decremento en 6.
Ejemplo Cursores
A la misma base de datos insertar la siguiente tabla
create table nombrecito(
cod int,
nombre varchar(25),
apellido varchar(25),
nombrecompleto varchar(50))
GUÍA 2 Pág. 14
open MICURSOR
--Avanzamos un registro y cargamos en las variables los valores encontrados
en el primer registro
fetch next from MICURSOR
into @cod, @nombre, @apellido
while @@fetch_status = 0
begin
update nombrecito set nombrecompleto= @nombre+' '+@apellido where cod=@cod
-- Avanzamos otro registro
fetch next from MICURSOR
into @cod, @nombre, @apellido
end
-- cerramos el cursor
close MICURSOR
deallocate MICURSOR
GUÍA 2 Pág. 15
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: