domingo, 7 de abril de 2024

Entrada 3 - 07/04/24

Hora Inicio: 10:00 a.m

Hora Fin: 3:00 p.m

Horas Trabajadas: 5 horas

Modalidad: Virtual


Se intento correr el SP en la base de datos, sin embargo, estaba tirando el siguiente error:

Cannot bulk load because the file "direccion\datos.xml" could not be opened. Operating system error code 5(Acceso denegado.).

Por lo que se decidió preguntar en el grupo si alguien más estaba teniendo el problema para poder saber si alguien había tenido el mismo error y sabia como solucionarlo.


Después de recibir varias respuestas y intentar todo lo que nos decían, aun salía el mismo error por lo que decidimos buscar alguna forma de solucionarlo.

Después de estar 3 horas analizando el bug sin poder solucionarlo y leer muchas formas, encontramos la solución al problema.

https://stackoverflow.com/questions/14555262/cannot-bulk-load-operating-system-error-code-5-access-is-denied#:~:text=This%20error%20appears%20when%20you,%3EAdvanced%20%2D%3E%20Find%20Now

Se logro solucionar, el error era que el servidor estaba en express por lo que SQL Express debía tener permisos para poder leer el XML. Una vez se pudo correr el SP había varios errores y al corregirlo el código quedo así:

ALTER PROCEDURE [dbo].[CargarXML]

AS

BEGIN

    DECLARE @Datos XML

    -- Aquí se asigna la ruta del archivo XML directamente en el código

    DECLARE @RutaXML NVARCHAR(500) = 'C:\Users\vales\OneDrive\Escritorio\datos.xml'

    -- Para cargar el archivo con una variable, CHAR(39) son comillas simples

    DECLARE @Comando NVARCHAR(500) = 'SELECT @Datos = D FROM OPENROWSET (BULK '  + CHAR(39) + @RutaXML + CHAR(39) + ', SINGLE_BLOB) AS Datos(D)' -- comando que va a ejecutar el sql dinámico

    DECLARE @Parametros NVARCHAR(500)

    SET @Parametros = N'@Datos XML OUTPUT' -- parámetros del sql dinámico

    EXECUTE sp_executesql @Comando, @Parametros, @Datos OUTPUT -- ejecutamos el comando que hicimos dinámicamente

    DECLARE @hdoc INT /*Creamos hdoc que va a ser un identificador*/

    EXEC sp_xml_preparedocument @hdoc OUTPUT, @Datos /*Toma el identificador y a la variable con el documento y las asocia*/

    -- Inserta en la tabla Puesto

    INSERT INTO [dbo].[Puesto] 

([Nombre]

, [SalarioxHora])

    SELECT 

        P.Nombre

        , SalarioxHora

    FROM OPENXML (@hdoc, '/Datos/Puestos/Puesto' , 1)

    WITH (

        Nombre VARCHAR(64) '@Nombre'

        ,SalarioxHora MONEY '@SalarioxHora'

    ) AS P

    -- Inserta en la tabla TipoEvento

    INSERT INTO [dbo].[TipoEvento] 

([id]

, [Nombre])

    SELECT 

        TE.Id

        , TE.Nombre

    FROM OPENXML (@hdoc, '/Datos/TiposEvento/TipoEvento' , 1)

    WITH (

        Id int '@Id'

        , Nombre VARCHAR(64) '@Nombre'

    ) AS TE

    -- Inserta en la tabla TipoMovimiento

    INSERT INTO [dbo].[TipoMovimiento] 

([Id]

, [Nombre]

, [TipoAccion])

    SELECT 

        TM.Id

        , TM.Nombre

        , CASE WHEN TipoAccion = 'Credito' THEN 'CR' 

           WHEN TipoAccion = 'Debito' THEN 'CD' 

           ELSE NULL

        END

    FROM OPENXML (@hdoc, '/Datos/TiposMovimientos/TipoMovimiento' , 1)

    WITH (

        Id INT '@Id'

        , Nombre VARCHAR(64) '@Nombre'

        , TipoAccion VARCHAR(64) '@TipoAccion'

    ) AS TM

    /*-- Limpia la tabla empleados

    DELETE FROM [dbo].[Empleado]

    -- Reinicia el identify

    DBCC CHECKIDENT ('Empleado', RESEED, 0)*/

    -- Inserta en la tabla Empleados

    INSERT INTO [dbo].[Empleado] 

([IdPuesto]

, [ValorDocumentoIdentidad]

, [Nombre]

, [FechaContratacion]

, [SaldoVacaciones]

, [EsActivo])

    SELECT 

        P.id

        , ValorDocumentoIdentidad

        , Emp.Nombre

        , FechaContratacion

        , 0

        , 1

    FROM OPENXML (@hdoc, '/Datos/Empleados/empleado' , 1)

    WITH (

        Puesto VARCHAR(64) '@Puesto'

        , ValorDocumentoIdentidad INT '@ValorDocumentoIdentidad'

        , Nombre VARCHAR(64) '@Nombre'

        , FechaContratacion DATE '@FechaContratacion'

    ) AS Emp

    INNER JOIN [dbo].[Puesto] AS P ON Emp.Puesto = P.Nombre;

    -- Inserta en la tabla Usuario

    INSERT INTO [dbo].[Usuario] 

([id]

, [Username]

, [Password])

    SELECT 

        Us.Id,

        Us.Nombre,

        Pass

    FROM OPENXML (@hdoc, '/Datos/Usuarios/usuario' , 1)

    WITH (

        Id INT '@Id'

        , Nombre VARCHAR(64) '@Nombre'

        , Pass NVARCHAR(16) '@Pass'

    ) AS Us

    -- Inserta en la tabla Movimiento

    INSERT INTO [dbo].[Movimiento] 

([IdEmpleado]

, [IdTipoMovimiento]

, [Fecha]

, [Monto]

, [NuevoSaldo]

, [IdPostByUser]

, [PostInIP]

, [PostTime])

    SELECT 

        E.id

        , TM.id

        , Mov.Fecha

        , Mov.Monto

, 0.0

        , U.id

        , Mov.PostInIP

        , Mov.PostTime

    FROM OPENXML (@hdoc, '/Datos/Movimientos/movimiento' , 1)

    WITH (

        ValorDocId INT '@ValorDocId'

        , IdTipoMovimiento VARCHAR(64) '@IdTipoMovimiento'

        , Fecha DATE '@Fecha'

        , Monto INT '@Monto'

        , PostByUser VARCHAR(64) '@PostByUser'

        , PostInIP VARCHAR(64) '@PostInIP'

        , PostTime DATETIME '@PostTime'

    ) AS Mov

    INNER JOIN [dbo].[Empleado] AS E ON Mov.ValorDocId = E.ValorDocumentoIdentidad

    INNER JOIN [dbo].[TipoMovimiento] AS TM ON Mov.IdTipoMovimiento = TM.Nombre

    INNER JOIN [dbo].[Usuario] AS U ON Mov.PostByUser = U.Username;

    -- Inserta en la tabla Error

    INSERT INTO [dbo].[Error] 

([Codigo]

, [Descripcion])

    SELECT 

        Codigo

        , Descripcion

    FROM OPENXML (@hdoc, '/Datos/Error/error' , 1)

    WITH (

        Codigo INT '@Codigo',

        Descripcion VARCHAR(2000) '@Descripcion'

    )

    EXEC sp_xml_removedocument @hdoc /*Remueve el documento XML de la memoria*/

END






No hay comentarios.:

Publicar un comentario

Entrada 8 - 20/04/24

Hora Inicio: 8 p.m Hora Fin: 10 p.m Horas Trabajadas: 2 horas Modalidad: Virtual Nos reunimos para terminar los últimos detalles del proyect...