sql >> Base de Datos >  >> RDS >> Access

Acceda con Microsoft SQL Server:importe grandes conjuntos de datos mediante SSIS

Acceso con Microsoft SQL Server:importe grandes conjuntos de datos mediante SSIS

Morir con una consulta de inserción de Access

Si alguna vez ha intentado insertar una gran cantidad de registros en SQL Server mediante una consulta de inserción de Access (15 000 registros o más), se encontrará con una larga espera. a 15). Incluso puede hacer que su base de datos se cuelgue si el conjunto de datos es demasiado grande. Entonces, ¿qué opciones tienes?

XML es un excelente primer intento

Uno de los métodos que generalmente usamos en nuestro código es trabajar con datos XML, no entraré en demasiados detalles sobre eso aquí, pero aquí hay un enlace que escribió un colega mío. Cubre una serie de 2 partes que analiza el trabajo con datos XML con un backend de SQL Server.

XML es una gran herramienta para probar, pero incluso eso puede no ser lo suficientemente rápido con conjuntos de datos que se cuentan en los 10,000. Sin embargo, la ventaja de XML sobre un trabajo de SSIS sería que un trabajo de SSIS requiere una carpeta de red a la que puedan acceder todos los usuarios de Access y el servidor. Eso no funcionaría bien en Internet (el escenario para el que se creó originalmente el método XML).

SSIS es súper rápido

Lo que quiero compartir con ustedes aquí es sobre mi experiencia trabajando con SQL Server Integration Services. Teníamos un cliente cuya base de datos ya usaba el método XML para cargar los datos en el servidor SQL, pero debido a que los datos que estaban importando tenían más de 700 000 filas de datos, el proceso tardaba 20 minutos en completarse. Claramente, esto estaba tomando demasiado tiempo para una empresa ocupada que necesitaba usar este método a diario. Nuestra solución fue eliminar Access del proceso de carga mediante la creación de un trabajo que leyera el archivo CSV directamente desde la ubicación del archivo e importara los datos a la tabla de SQL Server usando un script T-SQL simple.

El acceso solo inicia el proceso

Los usuarios seleccionarán su archivo de datos en Acceso e ingresarán cualquier otra información requerida, como una fecha y harán clic en el botón de proceso. El primer paso del código vba sería almacenar el nombre de archivo y la ruta a una tabla en SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

Aquí está el código vba utilizado para ejecutar el trabajo de SSIS.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String

‘Agregar código para activar el paquete SSIS
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

‘Lo siguiente repite un procedimiento para verificar si el trabajo se ha completado.
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

Hacer hasta rs.Fields(0) =4 y no es nulo(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Bucle

ImportData_Exit:
Establecer rs =Nada
Salir de la función

ImportData_Err:
MsgBox Err.Description
Reanudar ImportData_Exit
Reanudar 'para depuración

Función final
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;

EJECUTAR msdb.dbo.sp_start_job @Job_name =N'SSISDataImport';

FIN;
CREATE PROCEDURE [dbo].[uspSSISFileDataImportProcess]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@execution_id INT,
@JobStatusID INT,
@JobStatus Varchar(250),
@StartTime DATETIME2,
@EndTime DATETIME2;

ESPERAR RETRASO ’00:00:03′;

SELECCIONE @execution_id=MAX ([execution_id])
DESDE [SSISDB].[interno].[ejecuciones];

SELECCIONE
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
DESDE SSISDB .internal.executables AS e
LEFT JOIN SSISDB.internal.executable_statistics AS s
ON e.executable_id =s.executable_id AND s.execution_id =@execution_id;

SELECCIONE @JobStatusID, @JobStatus, @StartTime, @EndTime;
END;
Este procedimiento almacenado ejecutará un trabajo simple con el siguiente diseño.

 Obtener parámetros  – Este es un script T-SQL simple que selecciona el nombre del archivo y la ruta de la tabla sql y asigna los valores a los parámetros respectivos. SELECCIONE SSISDataImportFile DESDE tblApplicationSettings; El nombre del archivo diferiría de un día a otro, por lo que usar un parámetro era el camino a seguir, el nombre del archivo se ingresa en un objeto independiente en el formulario de acceso y luego, con la codificación VBA, se guarda en una tabla SQL, lo que permite que el paquete lea esto desde una tabla SQL (ver código arriba).

Truncar la entrada de hoy – Un simple script T-SQL para eliminar cualquier dato existente en la tabla de importación temporal, ejecutar los registros para realizar cambios o actualizaciones. Es posible que deba importar los datos primero a una tabla temporal en caso de que necesite verificar los datos o realizar más cambios en los datos antes de almacenarlos en la tabla permanente.

Tarea de flujo de datos – Explicado en la siguiente sección.

 Fuente de archivo plano:  Con los parámetros del primer paso, el trabajo puede acceder al archivo de texto.
El archivo debe almacenarse en una unidad de red o en una carpeta a la que pueda acceder el servidor.

Destino OLE DB  – Este paso final del trabajo es el proceso que importa los datos a la tabla de SQL Server. Aquí identifica la conexión de la base de datos y el nombre de la tabla. También es donde asignará los campos del archivo de texto a los campos de destino en la tabla.

Finalmente creé el procedimiento almacenado para devolver el ID de ejecución. El propósito aquí es que el procedimiento almacenado no se cerrará hasta que se complete el trabajo, evitando que el código VBA de Microsoft Access continúe hasta que se complete el trabajo. La idea del trabajo es simplemente obtener los datos en una tabla de SQL Server y, una vez allí, puede realizar cualquier modificación a los datos a través de Access y, finalmente, almacenar los datos en la tabla permanente.

¡De 20 minutos a 3!

Nuestro cliente estaba muy contento con los resultados, poder aprovechar la increíble tecnología de SQL Server junto con Access me permite hacer grandes avances en la eficiencia de mi trabajo, ¡no puedo esperar para volver a intentarlo pronto!

Únase a Susan Pyne el próximo martes 12 de febrero mientras analiza cómo cifrar columnas en SQL Server, como tarjetas de crédito y números de seguro social, y cómo descifrarlas para mostrarlas en Access, ¡excelente para proteger datos valiosos! Para obtener más información, visite https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption