Beruflich Dokumente
Kultur Dokumente
Unidad IV: Implementando bases de datos y tablas. Consultas mediante el uso de Transact de SQL Server 2008. Procedimientos almacenados.
Tabla de Contenido:
Unidad IV: Implementando bases de datos y tablas............................................................1 Unidad IV: Implementando bases de datos y tablas............................................................4 CASO DE ESTUDIO DE TRANSACT-SQL RESUELTO:..........................................................4 CREACION DE LA BASE DE DATOS................................................................................... 5 ESTABLECER LAS TABLAS DE LA BASE DE DATOS............................................................5 Creacin de cada una de las tablas de la base de datos ventas e inventarios de un negocio:........................................................................................................................... 5 Tareas evaluadas:............................................................................................................. 15 Consultas........................................................................................................................... 17 SELECT........................................................................................................................... 17 WHERE........................................................................................................................... 18 ORDER BY...................................................................................................................... 18 Insert into - Values......................................................................................................... 20 UPDATE.......................................................................................................................... 20 DELETE........................................................................................................................... 21 PROCEDIMIENTOS ALMACENADOS.................................................................................... 23 Ejemplo #1: .................................................................................................................. 23 Ejecucin de tipo #1...................................................................................................... 23 Ejecucin de tipo #2...................................................................................................... 24 Ejemplo #2: .................................................................................................................. 24 Ejecucin de tipo #1...................................................................................................... 24 Ejecucin de tipo #2...................................................................................................... 25 Ejemplo #3: .................................................................................................................. 26 Ejecucin de tipo #1...................................................................................................... 26 Ejecucin de tipo #2...................................................................................................... 26 Tareas de procedimientos almacenados:..........................................................................27 Notas para la prxima sesin del curso:............................................................................27 Practicando consultas partes dos................................................................................... 28 Tarea: Intrprete que es lo que hace este bloque de programacin: ............................31
Unidad IV.- Implementando bases de datos y tablas. 2
Funciones en Transact SQL............................................................................................... 32 Ejecutar funciones definidas por el usuario (motor de base de datos)..............................32 Funciones escalares....................................................................................................... 32 Funciones en lnea......................................................................................................... 36 ....................................................................................................................................... 38 Funcin que retorna una Tabla Continuando con la base de datos NorthWind...........39 Igual que el ejemplo anterior, la forma para Correr la Funcion:.....................................40 Funciones en lnea de mltiples sentencias ..................................................................40 Otros ejemplos............................................................................................................... 42 Tareas de Funciones creadas por el usuario..................................................................46 Bibliografa adicional que puede consultar en internet..................................................46 SQL SERVER Llamar Funciones de la base de datos directamente ..........................47
Tabla Cliente: CREATE TABLE Cliente( Cedula Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, Nombres Varchar(50)COLLATE Modern_Spanish_CI_AS NOT NULL, Apellidos Varchar(50)COLLATE Modern_Spanish_CI_AS NOT NULL, Telefono Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, Direccion Varchar(250)COLLATE Modern_Spanish_CI_AS NOT NULL, LimiteCredito Float NOT NULL, TotalCredito Float NOT NULL, Foto Varchar(250) NOT NULL, constraint PKCedula primary key(Cedula) )
Tabla Abonos: CREATE TABLE Abonos( IdAbono varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, Cedula varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, Abono Float NOT NULL, FechaAbono datetime NOT NULL, constraint PKIdAbono primary key(IdAbono), constraint FKCedula FOREIGN KEY(Cedula)references Cliente ) En la siguiente pgina observar como se ha creado la tabla de abonos.
Tabla Proveedor: CREATE TABLE Proveedor( Idproveedor Varchar(20), NombreEmpresa Varchar(100), Direccion Varchar(150), Telefono Varchar(20), constraint PKIdproveedor primary key(Idproveedor) )
Tabla Compras: CREATE TABLE Compras( IdCompras Varchar(20), IdProveedor Varchar(20), FechaCompras datetime, TotalCompras Float, Descuento Float, Impuesto Float, GranTotal Float, constraint PKIdCompras primary key(IdCompras), constraint FKIdproveedor FOREIGN KEY(Idproveedor)references Proveedor )
Tabla Productos: CREATE TABLE Productos( IdProducto Varchar(20), IdCategoria Varchar(20), Producto Varchar(200), UnidadMedida Varchar(20), PVU Float, Existencias Float, TipoDeInventario Varchar(20), constraint PKIdProducto primary key(IdProducto ) )
Tabla DetalleCompra: CREATE TABLE DetalleCompra ( IdCompras Varchar(20), IdProducto Varchar(20), Cantidad Float, CVU Float, SubTotal Float, constraint FKIdCompras FOREIGN KEY(IdCompras)references Compras, constraint FK_IdProducto FOREIGN KEY(IdProducto)references Productos
Unidad IV.- Implementando bases de datos y tablas. 9
Tabla de Factura: CREATE TABLE Factura( IdFactura Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, Cedula Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, TipoDeVenta Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, FechaFactura datetime NOT NULL, TotalFactura Float NULL, Hora Varchar(10)COLLATE Modern_Spanish_CI_AS NULL, Activo bit NULL, constraint PKIdFactura primary key(IdFactura ), constraint FK_Cedula FOREIGN KEY(Cedula)references Cliente )
10
Tabla de DetalleFactura: CREATE TABLE DetalleFactura( IdFactura Varchar(20)COLLATE Modern_Spanish_CI_AS NOT NULL, IdProducto Varchar(20), Cantidad Float NOT NULL, SubTotal Float NOT NULL constraint FKIdFactura FOREIGN KEY(IdFactura)references Factura, constraint FKIdProducto FOREIGN KEY(IdProducto)references Productos )
11
Lo primero que debe hacer es colocarse sobre la base de datos y en la opcin de diagrama, dar click derecho y especificar que desea un nuevo diagrama:
Al hacer click y ser activada la opcin de diagrama, le solicitara que seleccione las tablas, ver grafico en la siguiente pgina:
Unidad IV.- Implementando bases de datos y tablas. 12
13
14
Tareas evaluadas:
I.- Se deben realizar ciertos ajustes a las tablas, sin embargo, que significa lo siguiente: ALTER TABLE Abonos WITH NOCHECK ADD CONSTRAINT PK_Abonos PRIMARY KEY CLUSTERED(IdAbono) GO
ALTER TABLE Cliente WITH NOCHECK ADD CONSTRAINT Cliente_Telefono DEFAULT('No tiene') FOR Telefono, CONSTRAINT Cliente_LimiteCredito DEFAULT(0) FOR LimiteCredito, CONSTRAINT Cliente_TotalCredito DEFAULT(0) FOR TotalCredito, CONSTRAINT Llave_Cliente PRIMARY KEY CLUSTERED(Cedula) GO
Unidad IV.- Implementando bases de datos y tablas. 15
ALTER TABLE Compras WITH NOCHECK ADD CONSTRAINT Compras_TotalFactura DEFAULT(0)FOR TotalCompras, CONSTRAINT Compras_Descuento DEFAULT(0)FOR Descuento, CONSTRAINT Compras_Impuesto DEFAULT(0)FOR Impuesto, CONSTRAINT Compras_GranTotal DEFAULT(0)FOR GranTotal, CONSTRAINT Llave_Compras PRIMARY KEY CLUSTERED(IdCompras) GO
2.- Debe llenar cada una de las tablas con datos consistentes, es decir, datos entendibles, tales como nombre de productos reales. Cada tabla debe contener por lo menos de 15 a 25 registros. 3.- Se deben de crear las siguientes consultas: a.- Mostrar los productos por existencia y ordenados por el identificador. b.- Mostrar a todos los clientes con sus lmites de crditos, ordenados por el apellido. c.- Muestre cada una de las facturas del mes de septiembre, ordenadas en forma ascendente por la fecha de la facturacin. d.- Mostrar las compras que se han realizado, detallado el nombre del proveedor, as como la fecha en que se han realizado. El resto de consultas pendiente de la tarea, se asignaran la prxima semana.
16
Consultas
SELECT
1.- Recuperar todos los datos: SELECT * FROM Productos
Tarea consulta #1: Ahora usted muestre los productos con su precio, existenci y tipo de
inventario.
2.- Recuperar todos los datos de nombre de producto, unidades de medida, precio de venta por unidad y existencia de la tabla producto: SELECT Producto, UnidadMedida,PVU,Existencias FROM dbo.Productos
Tarea consulta #2: usted presente en pantalla a los clientes con cada uno de sus
detalles con sus respectivos registros.
17
WHERE
3.- Presentar los productos que tengan precio menor a 12.00 crdobas: SELECT Producto, UnidadMedida,PVU,Existencias FROM dbo.Productos WHERE PVU > 12.00
Tarea consulta #3: presente los productos que tienen en existencia una oscilacin entre
2000 a 5000 gramos en bodega. 4.- Presentar todos los productos que inicien con la letra A: SELECT Producto, UnidadMedida,PVU,Existencias FROM dbo.Productos WHERE Producto LIKE 'A%'
ORDER BY
5.- Ordenar los productos en orden ascendente segn el nombre del producto: SELECT Producto, UnidadMedida,PVU,Existencias FROM dbo.Productos ORDER BY Producto ASC
18
19
UPDATE
9.- Cambiar al cliente Giovanni Francisco Senz Araica su segundo apellido por senz: Select Cedula,Nombres,Apellidos From Cliente UPDATE Cliente SET Apellidos = 'Senz Senz' WHERE Apellidos = 'Senz Araica' AND Nombres = 'Giovanni Francisco' And Cedula = '00124121975-0009'
Unidad IV.- Implementando bases de datos y tablas. 20
/*** Visualizar el cambio de apellido en la Tabla. ***/ Select Cedula,Nombres,Apellidos From Cliente
DELETE
10.- Eliminar al Cliente Mara Mercedes Ortez Lpez: Select Cedula,Nombres,Apellidos From Cliente DELETE FROM Cliente WHERE Apellidos = 'Ortez Lpez' AND Nombres = 'Mara Mercedes' Select Nombres, Apellidos From Cliente
21
22
PROCEDIMIENTOS ALMACENADOS
Ejemplo #1:
-- Inicie con el Procedimiento Cliente: -- Hacer el ajuste a los datos para que pueda ser efectivo el cambio de los datos, sino, -- existiran problemas serios. @foto varchar(250) NULL alter Table dbo.Cliente alter Column Foto Varchar (100) Null -- Procedimiento almacenado para incoporar clientes en su respectiva tabla. Alter PROCEDURE SPGet_InsertarClientes @Cedula varchar(20), @Nombres Varchar(50), @Apellidos varchar(50), @Telefono varchar(20), @Direccion varchar(250), @TotalCredito float, @LimiteCredito float --@foto varchar(250) NULL AS Begin Insert into Cliente (cedula, Nombres, Apellidos, Telefono, Direccion, TotalCredito,LimiteCredito/*, Foto*/) Values(@cedula, @Nombres, @Apellidos, @Telefono, @Direccion, @TotalCredito, @LimiteCredito /*, @Foto*/) End
Ejecucin de tipo #1
-- Ejecutar el procedimiento almacenado, primera forma: USE [Ventas_ e _Inventario] GO DECLARE @return_value int
EXEC @return_value = [dbo].[SPGet_InsertarClientes] @Cedula = N'001-25051963-0007X', @Nombres = N'Francisco Donald', @Apellidos = N'Amrica Alcala', @Telefono = N'88614476', @Direccion = N'Praderas del Doral, Alameda #7, casa #173', @TotalCredito = 2500, @LimiteCredito = 184999
Unidad IV.- Implementando bases de datos y tablas. 23
SELECT GO
Ejecucin de tipo #2
-- Ejecutar el procedimiento almacenado, segunda forma: EXEC [dbo].[SPGet_InsertarClientes] '007-05041971-0008F', 'Eduardo Francisco', 'Navarro Arauz', '88940033', 'Mercado Guanuca, Calle central, casa #90', 250000, 1804990
Ejemplo #2:
-- Ahora con el Procedimiento para Factura: -- Insertar elementos en la tabla Factura: Create PROCEDURE SPGet_InsertarFactura @IdFactura varchar (20), @Cedula varchar(20), @TipoDeVenta Varchar(20), @FechaFactura datetime, @TotalFactura float, @Hora varchar(10), @activo bit --@Insertar elementos a la tabla Factura AS Begin Insert into Factura (IdFactura,Cedula,TipoDeVenta,FechaFactura,TotalFactura,Hora,activo) Values(@IdFactura,@Cedula,@TipoDeVenta,@FechaFactura,@TotalFactura,@Hora,@activ o) End
Ejecucin de tipo #1
-- Ejecutar el procedimiento almacenado, primera forma: USE [Ventas_ e _Inventario]
Unidad IV.- Implementando bases de datos y tablas. 24
GO DECLARE @return_value int EXEC @return_value = [dbo].[SPGet_InsertarFactura] @IdFactura = N'0002', @Cedula = N'001-24121975-0009', @TipoDeVenta = N'Productos de consumo', @FechaFactura = N'10-09-2011', @TotalFactura = 1099.99, @Hora = N'15:33', @activo = 'true' SELECT 'Return Value' = @return_value GO
Ejecucin de tipo #2
-- Ejecutar el procedimiento almacenado, segunda forma: EXECUTE [dbo].[SPGet_InsertarFactura] '0003', '001-24121975-0009', 'Productos de consumo', '10-09-2011', 996.99, '15:54', 'true'
-- Ejecutar el procedimiento almacenado, segunda forma: EXECUTE [dbo].[SPGet_InsertarFactura] '0006', '001-25081978-000F7', 'Productos de consumo', '24-09-2011', 3399.99, '06:31', 'true'
Ahora proceda a trabajar sobre la tabla Factura (completando usted los datos):
25
Ejemplo #3:
-- Ahora con el Procedimiento para insertar elementos en la tabla Productos: -- Insertar elementos en la tabla Productos: CREATE PROCEDURE SPGet_InsertarProductos @IdProducto varchar(20), @IdCategoria varchar(20), @Producto varchar(20), @UnidadMedida varchar(20), @PVU float, @Existencias float, @TipoDeInventario varchar(20) AS INSERT Into Productos (IdProducto, IdCategoria, Producto, UnidadMedida, PVU, Existencias,TipoDeInventario) VALUES(@IdProducto, @IdCategoria, @Producto, @UnidadMedida, @PVU, @Existencias, @TipoDeInventario)
Ejecucin de tipo #1
-- Ejecutar el procedimiento almacenado, primera forma: USE [Ventas_ e _Inventario] GO DECLARE @return_value int
EXEC @return_value = [dbo].[SPGet_InsertarProductos] @IdProducto = N'007', @IdCategoria = N'001', @Producto = N'Azucar refinada San Antonio', @UnidadMedida = N'Gramos', @PVU = 11.99, @Existencias = 9000, @TipoDeInventario = N'Granos bsicos' SELECT GO 'Return Value' = @return_value
Ejecucin de tipo #2
-- Ejecutar el procedimiento almacenado, segunda forma: EXEC [dbo].[SPGet_InsertarProductos] '008', '001', 'Azucar sulfitada San Antonio',
Unidad IV.- Implementando bases de datos y tablas. 26
Para que funcione lo anterior, usted debe haber incorporado los datos de facturacin del cliente, por ejemplo:
Tambin se debe tener avanzado el proyecto, ya que este est dividido en cinco etapas y cada una tiene un valor del entre 50% a 70% del curso (si no se realiza esta parte, automticamente reprueba el mdulo II).
En este momento, se necesita presentar en pantalla, los nombres de los clientes con su lmite de crdito y total de crdito, con el detalle, que se muestren nicamente, los clientes
Unidad IV.- Implementando bases de datos y tablas. 28
que cuentan con un lmite de crdito que tienen oscila entre 2000 y 3000. Ordenarlos por el nombre de los clientes en forma ascendente. Select Nombres, LimiteCredito, TotalCredito From Cliente Where TotalCredito Between 2000 and 30000 ORDER BY Nombres asc
Con respecto al caso anterior, ahora se le pide, que muestre todos los clientes que tienen crdito que se diferente al rango de 200 a 3000. Select Nombres, LimiteCredito, TotalCredito From Cliente Where TotalCredito Not Between 2000 and 30000 ORDER BY Nombres asc Mostrar los clientes por su nmero de cedula, nombre, limite de crdito y total de crdito que han facturado en tipo de venta de productos de consumo: Select Cedula, Nombres, LimiteCredito, TotalCredito From Cliente Where Cedula In (Select Cedula--,TipoDeVenta From dbo.Factura Where TipoDeVenta = 'Productos de consumo')
Mostrar los clientes que han facturado productos: Select Cedula, Nombres, LimiteCredito, TotalCredito From Cliente Where Cedula = Any (Select Cedula --,TipoDeVenta
Unidad IV.- Implementando bases de datos y tablas. 29
From dbo.Factura )
Observar el contenido de la tabla factura con respecto a la venta total de cada factura: Select IdFactura, TotalFactura As ventas From dbo.Factura Contar la cantidad de facturas que se han emitido en la base de datos: declare @factM Float Select @factM = Count(TotalFactura) From Factura Print @factM -- Tarea: muestre e incorpore un mensaje que expresa el resultado de la consulta, tal como: La cantidad de facturas es: el valor de la variable Encontrar la factura con el mayor valor de venta: declare @factM Float --Encontrar la factura con la mayor venta: Select @factM = MAX(TotalFactura) From Factura Print @factM --Tarea: Muestre el mensaje y el nombre del cliente de esa factura. --Encontrar la factura con la menor venta: declare @factM Float Select @factM = Min(TotalFactura) From Factura Print @factM --Tarea: Muestre el mensaje y el nombre del cliente de esa factura. --Encontrar el promedio de venta de la facturaemitidas: declare @factM Float Select @factM = AVG(TotalFactura) From Factura Print @factM --Tarea: Muestre el mensaje y el nombre del cliente de esa factura.
30
CREATE FUNCTION FncGet_Calcularsubtotaldetalleservicio (@IDProducto Varchar(20),@Cantidad Float) Returns Float AS Begin Declare @Subtotal Float Select @Subtotal = @Cantidad * PVU FROM Productos Where IDProducto = @IDProducto Return @Subtotal End Ejecucin de esta funcin: Select IdProducto, Pvu as UNIDADES, dbo.FncGet_Calcularsubtotaldetalleservicio(IdProducto, Pvu) as Resultado From Productos
31
Funciones en Transact SQL Ejecutar funciones definidas por el usuario (motor de base de datos)
Las funciones definidas por el usuario se pueden invocar en consultas o en otras instrucciones o expresiones, como columnas calculadas o expresiones de cadena. Las funciones escalares se pueden ejecutar mediante la instruccin EXECUTE. Puede invocar una funcin definida por el usuario que devuelve un valor escalar en cualquier parte de una expresin escalar del mismo tipo de datos que se permite en las instrucciones Transact-SQL. Las funciones escalares deben invocarse como mnimo con el nombre de dos partes de la funcin. Para obtener ms informacin sobre los nombres con varias partes, vea Convenciones de sintaxis de Transact-SQL (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 o retorno (o devuelven) un dato de tipo tabla. 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
Unidad IV.- Implementando bases de datos y tablas. 32
El siguiente ejemplo muestra cmo 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 cmo 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, -- Ejecucin de la funcion: dbo.fn_MultiplicaSaldo( NUMCUENTA, IDCUENTA) AS RESULTADO FROM CUENTAS Las funciones escalares son muy similares a procedimientos almacenados con parmetros de salida, pero estas pueden ser utilizadas en consultas de seleccin y en la clausula where de las mismas.
Unidad IV.- Implementando bases de datos y tablas. 33
Alter FUNCTION fn_Trae_GramosProductos ( @NumCuenta VARCHAR(20), @Multiplicador DECIMAL(10,2) ) RETURNS DECIMAL(10,2) AS BEGIN DECLARE @Saldo DECIMAL(10,2), @Return DECIMAL(10,2) SELECT @Saldo = Existencias FROM Productos WHERE IdProducto = @NumCuenta SET @Return = @Saldo * @Multiplicador RETURN @Return END
SELECT IDProducto, PVU, UnidadMedida, Existencias, -- Ejecucin de la funcion: dbo.fn_Trae_GramosProductos(IdProducto, 2.45) AS RESULTADO FROM Productos
Unidad IV.- Implementando bases de datos y tablas. 34
En este caso, para el ejemplo que se est desarrollando, procesa a crear la siguiente funcin, donde podr ver los parmetros que se reciben, as como lo que retorna la funcin: alter FUNCTION fn_traslado_GramosALibrasXProductos ( @IdProductos varchar(20), @existencias float, @valor_medida_conversion float ) RETURNS float AS BEGIN DECLARE @valor_Convertido float--, --@Return float SELECT @existencias = existencias FROM Productos Where IDProducto = @IDProductos SET @valor_Convertido = @existencias * @valor_medida_conversion RETURN @valor_convertido END Ejecucin de la funcin: Select /*IdProducto, dbo.fn_Conversion_GramosALibrasXProductos producto, pvu, Existencia, fn_Conversion_GramosALibrasXProductos(existencia, 2.54)*/ existencias As [Valor en Gramos] , dbo.fn_traslado_GramosALibrasXProductos(IdProducto,Existencias, 2.54/1000) as [Cambio a Libras] From Productos
35
Funciones en lnea
Las funciones en lnea son las funciones que devuelven un conjunto de resultados correspondientes a la ejecucin de una sentencia SELECT. La sintaxis para una funcin de tabla en lnea 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 cmo crear una funcin en lnea. CREATE FUNCTION fn_MovimientosCuenta ( @NumCuenta VARCHAR(20) ) RETURNS TABLE AS RETURN ( SELECT MOVIMIENTOS.*
Unidad IV.- Implementando bases de datos y tablas. 36
FROM MOVIMIENTOS INNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTA WHERE CUENTAS.NUMCUENTA = @NumCuenta ) No se puede utilizar la clausula ORDER BY en la sentencia de una funcin el lnea. Las funciones en lnea pueden utilizarse dentro de joins o querys como si fueran una tabla normal.
SELECT * FROM fn_MovimientosCuenta('200700000001')
Ahora bien, llevando este caso a la prctica del ejemplo que se vincula con la base de datos que se est desarrollando en esta gua, proceda a escribirla en la ventana de consulta. Bsicamente lo que se busca aqu, es encontrar un cliente determinado y observar el total de las compras que ha realizado, esto en base a la informacin facturada. CREATE FUNCTION fn_Movimientos_Facturas ( @IdFactura VARCHAR(20) ) RETURNS TABLE AS RETURN ( SELECT dbo.Factura.IdFactura, dbo.Cliente.Cedula, dbo.Cliente.Nombres, dbo.Cliente.Apellidos, dbo.Factura.TipoDeVenta, dbo.Factura.TotalFactura FROM dbo.Factura INNER JOIN dbo.Cliente ON dbo.Factura.Cedula = dbo.Cliente.Cedula WHERE dbo.Factura.Cedula= @IdFactura --'001-25081978-000F7' ) Al crear la funcin, usted podr observar que est se ha agregado como parte de funciones que retornan tablas dentro de la parte de programacin de la base de datos que se est desarrollando en este momento:
Unidad IV.- Implementando bases de datos y tablas. 37
La manera en que se invoca a la funcin, se muestra a continuacin (recuerde pasar como parmetro un nmero de cedula valido y que exista dentro de los clientes que ya han emitido o realizado compras): SELECT * FROM fn_Movimientos_Facturas ('001-25081978-000F7')
Su equivalente en consulta es: SELECT dbo.Factura.IdFactura, dbo.Cliente.Cedula, dbo.Cliente.Nombres, dbo.Cliente.Apellidos, dbo.Factura.TipoDeVenta, dbo.Factura.TotalFactura FROM dbo.Factura INNER JOIN dbo.Cliente ON dbo.Factura.Cedula = dbo.Cliente.Cedula WHERE dbo.Factura.Cedula= '001-25081978-000F7' Es importante sealar la diferencia, en el primer caso tendr el control de cualquier cliente solo por el nmero de la cedula para encontrar el valor de las productos facturados. Mientras que en el segundo caso, es una consulta, la cual posteriormente debe invocar y hacer el ajuste constantemente (adems de recordar guardarla en algn lugar):
Unidad IV.- Implementando bases de datos y tablas. 38
Resultado de una funcin lineal, en este caso se muestra de donde se genera la consulta.
Funcin que retorna una Tabla Continuando con la base de datos NorthWind
A diferencia del tipo de funcin escalar (caso anterior), aqu se retorna una tabla, la cual mostrara dos campos CategoryId y CategoryN. Lo interesante de este tipo de funcion es el trato que se le da a los datos. CREATE FUNCTION [dbo].[FncGetCategoriasLineal2] ( @categoria nvarchar(15) ) RETURNS TABLE Return (select CategoryId, CategoryName From Categories where CategoryName = @categoria)
39
) AS BEGIN -- Sentencias que cargan de datos la tabla declarada RETURN END El siguiente ejemplo muestra el uso de una funcin de tabla de multi sentencias. /* Esta funcin 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)
Unidad IV.- Implementando bases de datos y tablas. 41
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;
Otros ejemplos
Unidad IV.- Implementando bases de datos y tablas. 42
Es necesario crear una funcin que sea capaz de poder cambiar el campo de regin que aparezca como NULL y en vez de estos, se muestre como valor no aplica en la tabla de Employees de la base de datos Northwind: USE Northwind --Solucin al problema GO CREATE FUNCTION fn_NewRegion (@myinput nvarchar(30)) RETURNS nvarchar(30) BEGIN IF @myinput IS NULL SET @myinput = 'No Aplica' RETURN @myinput END
Ejecucion de la funcion fn_NewRegion SELECT LastName, City, dbo.fn_NewRegion(Region) AS Region, Country FROM dbo.Employees Resultado en pantalla:
43
Ahora se requiere poder controlar el formato de la fecha, es decir, programar que aparezca separado el mes, da y ao por dos puntos, crear la funcin capaz de hacer esto en SQL Server: USE Northwind GO CREATE FUNCTION fn_DateFormat (@indate datetime, @separator char(1)) RETURNS Nchar(20) AS BEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator + CONVERT(Nvarchar(20), datepart(dd, @indate)) + @separator + CONVERT(Nvarchar(20), datepart(yy, @indate)) END Ejecucion de la funcion fn_NewRegion SELECT dbo.fn_DateFormat(GETDATE(), ':')
Unidad IV.- Implementando bases de datos y tablas. 44
45
46
Ejemplos de funciones, lo que puede encontrar en los sitios de referencia descrito anteriormente: http://www.devjoker.com/contenidos/catss/239/Funciones-en-Transact-SQL.aspx Ver esta pgina: http://www.sqlserverya.com.ar/temarios/descripcion.php?cod=141&punto=135
Funcin escalar
CREATE FUNCTION [ nombrePropietario. ] nombreFuncin ( [ { @nombreParmetro tipoDatosParmetroEscalar [ = predeterminado ] } [ ,...n ] ] ) RETURNS tipoDatosDevolucinEscalar [ WITH < opcinFuncin > [,...n] ] [ AS ] BEGIN cuerpoFuncin RETURN expresinEscalar END
http://www.mygnet.net/manuales/sqlserver//funciones_definidas_por_el_usuario.1084
SELECT [FirstName] + ' ' + [LastName]) FROM [dbo].[risk_user] WHERE [userid] = @userid ) END Esta UDF es muy senclla: simplemente devuelve el nombre de un usuario, recibiendo como parmetro el ID de usuario. 2.- Ahora, cmo lo llamo directamente? Si estn en el SQL SERVER Management Studio, simplemente presionen el botn Nueva consulta y tipeen SELECT [dbo].[risk_user_GetDescription](1) Luego presionen F5 para que se ejecute la consulta. Vern que se originan resultados. Si se dan cuenta, es muy simple: slo aad un SELECT antes del nombre de la UDF y al final simplemente le pas el parmetro que requiere la funcin. Si quisieras hacer lo mismo ( llamar una UDF directamente ) desde el Visual Studio, tambin se puede. Simplemente haras esto:
Dim connection As New SqlConnection("server=.\SQLEXPRESS;database=midatabase;uid=sa;pwd=") Dim command As New SqlCommand("SELECT [dbo].[risk_user_GetDescription](1)", connection) command.CommandType = CommandType.Text connection.Open() Dim NombreDeUsuario As String = DirectCast(command.ExecuteScalar(), String) connection.Close()
Lo que hace este cdigo es llamar a la UDF directamente, y la variable NombreDeUsuario es la que recibe el resultado. Yo he hecho el ejemplo con una funcin que devuelve un string, les dejo como tarea a Uds el que traten con funciones que devuelven otros tipos de datos. ;)
48