Sesión #4
Sesión #4, duración 5 horas 7:00pm-12mn
En esta sesión se trabajó en la creación del SP de cargar XML, el mismo funcionó y cargó los datos en 427ms.
ALTER PROCEDURE CargarDatosDesdeXML
@xmlData XML
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
-- Insertar en la tabla Puesto
INSERT INTO dbo.Puesto (Nombre, SalarioxHora)
SELECT
Puesto.value('@Nombre', 'VARCHAR(128)'),
Puesto.value('@SalarioxHora', 'MONEY')
FROM @xmlData.nodes('/Datos/Puestos/Puesto') AS T(Puesto);
-- Insertar en la tabla TipoEvento
INSERT INTO dbo.TipoEvento (Id, Nombre)
SELECT
TipoEvento.value('@Id', 'INT'),
TipoEvento.value('@Nombre', 'VARCHAR(128)')
FROM @xmlData.nodes('/Datos/TiposEvento/TipoEvento') AS T(TipoEvento);
-- Insertar en la tabla TipoMovimiento
INSERT INTO dbo.TipoMovimiento (Id, Nombre, TipoAccion)
SELECT
TipoMovimiento.value('@Id', 'INT'),
TipoMovimiento.value('@Nombre', 'VARCHAR(128)'),
TipoMovimiento.value('@TipoAccion', 'VARCHAR(128)')
FROM @xmlData.nodes('/Datos/TiposMovimientos/TipoMovimiento') AS T(TipoMovimiento);
-- Insertar en la tabla Usuario
INSERT INTO dbo.Usuario (Id, Username, Pass)
SELECT
Usuario.value('@Id', 'INT'),
Usuario.value('@Nombre', 'VARCHAR(128)'),
Usuario.value('@Pass', 'VARCHAR(128)')
FROM @xmlData.nodes('/Datos/Usuarios/usuario') AS T(Usuario);
-- Insertar en la tabla Empleado
INSERT INTO dbo.Empleado (IdPuesto, ValorDocumentoIdentidad, Nombre, FechaContratacion)
SELECT
(SELECT Id FROM dbo.Puesto WHERE Nombre = Empleado.value('@Puesto', 'VARCHAR(128)')),
Empleado.value('@ValorDocumentoIdentidad', 'VARCHAR(128)'),
Empleado.value('@Nombre', 'VARCHAR(128)'),
Empleado.value('@FechaContratacion', 'DATE')
FROM @xmlData.nodes('/Datos/Empleados/empleado') AS T(Empleado);
-- Insertar en la tabla Movimiento
INSERT INTO dbo.Movimiento (IdEmpleado, IdTipoMovimiento, Fecha, Monto, NuevoSaldo, IdPostByUser, PostInIP, PostTime)
SELECT
(SELECT Id FROM dbo.Empleado WHERE ValorDocumentoIdentidad = Movimiento.value('@ValorDocId', 'VARCHAR(128)')),
(SELECT Id FROM dbo.TipoMovimiento WHERE Nombre = Movimiento.value('@IdTipoMovimiento', 'VARCHAR(128)')),
Movimiento.value('@Fecha', 'DATETIME'),
Movimiento.value('@Monto', 'INT'),
Movimiento.value('@Monto', 'INT'), -- Ajustar el nuevo saldo correctamente según la lógica
(SELECT Id FROM dbo.Usuario WHERE Username = Movimiento.value('@PostByUser', 'VARCHAR(128)')),
Movimiento.value('@PostInIP', 'VARCHAR(64)'),
Movimiento.value('@PostTime', 'DATETIME')
FROM @xmlData.nodes('/Datos/Movimientos/movimiento') AS T(Movimiento);
-- Insertar en la tabla Error
INSERT INTO dbo.Error (Codigo, Descripcion)
SELECT
Error.value('@Codigo', 'INT'),
Error.value('@Descripcion', 'VARCHAR(128)')
FROM @xmlData.nodes('/Datos/Error/error') AS T(Error);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
-- Manejar el error
INSERT INTO dbo.DBErrors (UserName, Number, State, Severity, Line, [Procedure], Message, DateTime)
VALUES (
SYSTEM_USER,
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE()
);
END CATCH;
END;
GO
También se creó el SP que inserta el empleado, el mismo ya existía del semestre pasado, por lo cual solo se mejoró el mismo y ahora funciona:
CREATE PROCEDURE [dbo].[InsertarEmpleado]
@Puesto VARCHAR(128) ,
@ValorDocumentoIdentidad VARCHAR(128),
@Nombre VARCHAR(128),
@FechaContratacion DATE,
@Username VARCHAR(128),
@PostInIP VARCHAR(64),
@PostTime DATETIME,
@OutResultCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
SET @OutResultCode=0;
IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE Nombre = @Nombre)
BEGIN
SET @OutResultCode=50005;
END
ELSE
BEGIN
IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE ValorDocumentoIdentidad = @ValorDocumentoIdentidad)
BEGIN
SET @OutResultCode=50004;
END
ELSE
BEGIN
DECLARE @IdPuesto INT;
SELECT @IdPuesto = Id FROM dbo.Puesto WHERE Nombre = @Puesto;
BEGIN TRANSACTION;
INSERT INTO dbo.Empleado
(
IdPuesto,
ValorDocumentoIdentidad,
Nombre,
FechaContratacion
)
VALUES
(
@IdPuesto,
@ValorDocumentoIdentidad,
@Nombre,
@FechaContratacion
);
SET @OutResultCode=0;
BEGIN
COMMIT TRANSACTION;
BEGIN
SELECT @OutResultCode AS OutResultCode;
INSERT INTO dbo.bitacoraEvento(
IdTipoEvento,
IdUsuario,
Fecha,
Descripcion,
PostInIP,
PostTime
) VALUES (
6,
(SELECT Id FROM dbo.Usuario WHERE Username = @Username),
GETDATE(),
'Insercion no exitosa',
@PostInIP,
@PostTime
);
END
END
END--2DO ELSE
END--1ER ELSE
IF @OutResultCode=0
BEGIN
SELECT @OutResultCode AS OutResultCode;
END
ELSE
IF @OutResultCode=50004
BEGIN
SELECT @OutResultCode AS OutResultCode;
INSERT INTO dbo.bitacoraEvento(
IdTipoEvento,
IdUsuario,
Fecha,
Descripcion,
PostInIP,
PostTime
) VALUES (
5,
(SELECT Id FROM dbo.Usuario WHERE Username = @Username),
GETDATE(),
'Insercion no exitosa',
@PostInIP,
@PostTime
);
END
ELSE
IF @OutResultCode=50005
BEGIN
SELECT @OutResultCode AS OutResultCode;
BEGIN
INSERT INTO dbo.bitacoraEvento(
IdTipoEvento,
IdUsuario,
Fecha,
Descripcion,
PostInIP,
PostTime
) VALUES (
5,
(SELECT Id FROM dbo.Usuario WHERE Username = @Username),
GETDATE(),
'Insercion no exitosa',
@PostInIP,
@PostTime
);
END
END
END TRY
BEGIN CATCH
INSERT INTO dbo.DBErrors VALUES (
SUSER_SNAME(),
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE()
);
END CATCH;
SET NOCOUNT Off;
END;
Comentarios
Publicar un comentario