Uso de parámetros: Similar a las funciones, aceptan parámetros de entrada y salida. Esto permite recibir valores al ejecutarse y devolver resultados.
Seguridad: Es posible controlar los permisos para ejecutar un procedimiento, limitando el acceso a las tablas. Solo el código pre-aprobado será ejecutado.
Mejora del rendimiento:
4 Ejercicios
Se Crea la base de datos Clase02_Ejercicios utilizando el siguiente script:
from sqlalchemy import create_engine, textimport pandas as pd# connection stringserver =r'.\SQLEXPRESS'username =r'sauk'password =r'123'database =r'master'driver =r'SQL+Server'connection_string =f'mssql+pyodbc://{username}:{password}@{server}/{database}?driver={driver}'# SQLAlchemy engineengine = create_engine(connection_string)# queriesqueries = []queries.append(text('''IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'Clase02_Ejercicios')BEGIN CREATE DATABASE Clase02_Ejercicios;END;'''))queries.append(text('''USE Clase02_Ejercicios;'''))queries.append(text('''CREATE TABLE Estudiantes ( ID INT IDENTITY PRIMARY KEY, Nombre VARCHAR(100) NOT NULL, Edad INT, FechaIngreso DATE);'''))queries.append(text('''INSERT INTO Estudiantes (Nombre, Edad, FechaIngreso) VALUES ('Juan Pérez', 20, '2022-03-15'), ('Ana López', 22, '2022-05-21'), ('Luis Martínez', 17, '2022-01-11'), ('Carmen Ríos', 19, '2022-02-07'), ('Carlos Sánchez', 23, '2022-08-25'), ('Lucía Fernández', 21, '2022-09-30'), ('Diego Alonso', 18, '2022-04-14'), ('Isabel Mora', 25, '2022-07-19');'''))# execute querieswith engine.connect() as conn:for query in queries: conn.execute(query)
4.1 Ejercicio 01
Creación de una función: Crea una función fn_CantidadEstudiantes que devuelva el número total de estudiantes.
Solución
CREATEFUNCTION fn_CantidadEstudiantes()RETURNS INTASBEGINDECLARE @numEstudiantes INT;SELECT @numEstudiantes =COUNT(*) FROM Estudiantes;RETURN @numEstudiantes;END;
python code
queries.append(text('''CREATE FUNCTION fn_CantidadEstudiantes()RETURNS INTASBEGIN DECLARE @numEstudiantes INT; SELECT @numEstudiantes = COUNT(*) FROM Estudiantes; RETURN @numEstudiantes;END;'''))
4.2 Ejercicio 02
Uso de la función: Utiliza la función creada para mostrar el total de estudiantes.
Solución
SELECT dbo.fn_CantidadEstudiantes() AS TotalEstudiantes;
python code
query_select = text('''SELECT dbo.fn_CantidadEstudiantes() AS TotalEstudiantes;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
TotalEstudiantes
8
4.3 Ejercicio 03
Creación de un procedimiento almacenado para actualizar edad: Crea un procedimiento almacenado sp_ActualizarEdad que permita actualizar la edad de un estudiante dado su ID.
queries.append(text('''CREATE PROCEDURE sp_ActualizarEdad @EstudianteID INT, @NuevaEdad INTASBEGIN UPDATE Estudiantes SET Edad = @NuevaEdad WHERE ID = @EstudianteID;END;'''))
4.4 Ejercicio 04
Uso del procedicimiento almacenado para actualizar edad: Actualiza la edad del estudiante con ID 1, a 22 años usando el procedimiento sp_ActualizarEdad.
queries.append(text('''EXEC sp_ActualizarEdad @EstudianteID = 1, @NuevaEdad = 22;'''))query_select = text('''SELECT *FROM EstudiantesWHERE ID = 1;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Nombre
Edad
FechaIngreso
1
Juan Pérez
22
2022-03-15
4.5 Ejercicio 05
Creación de índices sobre múltiples columnas: Crea un índice compuesto en las columnas Nombre y FechaIngreso para optimizar las consultas que usan estos campos.
Solución
CREATE NONCLUSTERED INDEX ix_NombreFechaIngresoON Estudiantes(Nombre, FechaIngreso);-- consulta opcional: para verificar la creación de índiceSELECT ind.name AS IndexName, ind.type_desc ASIndexType, col.name AS ColumnNameFROM sys.indexes indJOIN sys.index_columns ic ON ind.object_id = ic.object_id AND ind.index_id = ic.index_idJOIN sys.columns col ON ic.object_id = col.object_id AND ic.column_id = col.column_idWHERE ind.object_id = OBJECT_ID('Estudiantes')ORDERBY ind.name;
python code
queries.append(text('''CREATE NONCLUSTERED INDEX ix_NombreFechaIngresoON Estudiantes(Nombre, FechaIngreso);'''))query_select = text('''SELECT ind.name AS IndexName, ind.type_desc AS IndexType, col.name AS ColumnNameFROM sys.indexes indJOIN sys.index_columns ic ON ind.object_id = ic.object_id AND ind.index_id = ic.index_idJOIN sys.columns col ON ic.object_id = col.object_id AND ic.column_id = col.column_idWHERE ind.object_id = OBJECT_ID('Estudiantes')ORDER BY ind.name;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
IndexName
IndexType
ColumnName
ix_NombreFechaIngreso
NONCLUSTERED
Nombre
ix_NombreFechaIngreso
NONCLUSTERED
FechaIngreso
PK__Estudian__3214EC2756C578C3
CLUSTERED
ID
4.6 Ejercicio 06
Consulta avanzada de estudiantes: Escribe una consulta SQL que liste todos los estudiantes menores de 25 años, ordenados por fecha de ingreso de manera ascendente.
queries.append(text('''DELETE FROM EstudiantesWHERE Edad > 30;'''))query_select = text('''SELECT *FROM Estudiantes;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Nombre
Edad
FechaIngreso
1
Juan Pérez
23
2022-03-15
2
Ana López
23
2022-05-21
3
Luis Martínez
18
2022-01-11
4
Carmen Ríos
20
2022-02-07
5
Carlos Sánchez
24
2022-08-25
6
Lucía Fernández
22
2022-09-30
7
Diego Alonso
19
2022-04-14
8
Isabel Mora
26
2022-07-19
4.9 Ejercicio 09
Creación de vistas complejas: Crea una vista llamada VistaEstudiantesActivos que muestre solamente los estudiantes que tienen menos de 30 años y ordena los resultados por edad de manera descendente.
queries.append(text('''CREATE VIEW VistaEstudiantesActivos AS SELECT * FROM Estudiantes WHERE Edad < 30;'''))query_select = text('''SELECT *FROM VistaEstudiantesActivosORDER BY Edad DESC;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Nombre
Edad
FechaIngreso
8
Isabel Mora
26
2022-07-19
5
Carlos Sánchez
24
2022-08-25
1
Juan Pérez
23
2022-03-15
2
Ana López
23
2022-05-21
6
Lucía Fernández
22
2022-09-30
4
Carmen Ríos
20
2022-02-07
7
Diego Alonso
19
2022-04-14
3
Luis Martínez
18
2022-01-11
4.10 Ejercicio 10
Función para calcular la edad mínima: Desarrolla una función llamada fn_EdadMinimaEstudiantes que devuelva la edad mínima de los estudiantes.
Solución
CREATEFUNCTION fn_EdadMinimaEstudiantes()RETURNS INTASBEGINDECLARE @minEdadSELECT @minEdad =MIN(Edad) FROM EstudiantesRETURN @minEdad;END;SELECT dbo.fn_EdadMinimaEstudiantes() AS EdadMinima;
python code
queries.append(text('''CREATE FUNCTION fn_EdadMinimaEstudiantes()RETURNS INTASBEGIN DECLARE @minEdad INT SELECT @minEdad = MIN(Edad) FROM Estudiantes RETURN @minEdad;END;'''))query_select = text('''SELECT dbo.fn_EdadMinimaEstudiantes() AS EdadMinima;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output