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.
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