Access
 sql >> Database >  >> RDS >> Access

Accesso con Microsoft SQL Server:importa set di dati di grandi dimensioni utilizzando SSIS

Accesso con Microsoft SQL Server:importa set di dati di grandi dimensioni utilizzando SSIS

Morire con una query di inserimento di accesso

Se hai mai provato a inserire una grande quantità di record in SQL Server usando una query di inserimento di Access (15.000 record o più), ti aspetta una lunga attesa, stavi parlando di una pausa caffè qui (da pochi minuti a 15). Potrebbe anche causare il blocco del database se il set di dati è troppo grande. Quindi quali opzioni hai?

XML è un ottimo primo tentativo

Uno dei metodi che generalmente utilizziamo nel nostro codice è lavorare con i dati XML, non entrerò troppo nei dettagli su questo qui, ma ecco un link che ha scritto un mio collega. Copre una serie in 2 parti che illustra l'utilizzo dei dati XML con un back-end di SQL Server.

XML è un ottimo strumento da provare, ma anche quello potrebbe non essere abbastanza veloce con la numerazione dei set di dati nell'ordine delle 10.000. Tuttavia, il vantaggio di XML rispetto a un processo SSIS sarebbe che un processo SSIS richiede una cartella di rete in cui possono raggiungere tutti gli utenti di Access e il server. Non funzionerebbe bene su Internet (lo scenario per il quale era stato creato originariamente il metodo XML).

SSIS è velocissimo

Quello che voglio condividere con te qui riguarda la mia esperienza di lavoro con SQL Server Integration Services. Avevamo un client il cui database stava già utilizzando il metodo XML per caricare i dati sul server SQL, ma poiché i dati che stavano importando avevano oltre 700.000 righe di dati, ci volevano 20 minuti per completare il processo. Ciò stava chiaramente richiedendo troppo tempo per un'azienda impegnata che aveva bisogno di utilizzare questo metodo ogni giorno. La nostra soluzione era rimuovere Access dal processo di caricamento creando un processo che leggesse il file CSV direttamente dal percorso del file e importasse i dati nella tabella di SQL Server utilizzando un semplice script T-SQL.

L'accesso avvia solo il processo

Gli utenti selezioneranno il proprio file di dati in Access e inseriranno qualsiasi altra informazione richiesta, come una data, e faranno clic sul pulsante di elaborazione. Il primo passaggio del codice vba consiste nell'archiviazione del nome file e del percorso di una tabella in SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

Ecco il codice vba utilizzato per eseguire quindi il lavoro SSIS.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String

‘Aggiungi codice per attivare il pacchetto SSIS
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

'Di seguito viene riprodotta una procedura per verificare se il lavoro è stato completato.
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

Fare fino a rs.Fields(0) =4 e non IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Ciclo

ImportData_Exit:
Imposta rs =Niente
Esci dalla funzione

ImportData_Err:
MsgBox Err.Description
Riprendi ImportData_Exit
Riprendi 'per il debug

End Function
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;

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

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

ATTENDERE RITARDO '00:00:03′;

SELECT @execution_id=MAX ([execution_id])
DA [SSISDB].[interno].[esecuzioni];

SELECT
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
DA SSISDB .internal.executables AS e
SINISTRA UNISCITI A SSISDB.internal.executable_statistics AS s
ON e.executable_id =s.executable_id AND s.execution_id =@execution_id;

SELECT @JobStatusID, @JobStatus, @StartTime, @EndTime;
END;
Questa procedura memorizzata eseguirà un semplice processo con il seguente design.

 Ottieni parametri  – Questo è un semplice script T-SQL che seleziona il nome del file e il percorso dalla tabella sql e assegna i valori ai rispettivi parametri. SELEZIONA SSISDataImportFile DA tblApplicationSettings; Il nome del file varia di giorno in giorno, quindi l'utilizzo di un parametro era la strada da percorrere, il nome del file viene inserito in un oggetto non associato nel modulo di accesso, quindi con la codifica VBA viene salvato in una tabella SQL, consentendo al pacchetto di leggerlo da una tabella SQL (vedi codice sopra).

Tronca l'input di oggi – Un semplice script T-SQL per rimuovere tutti i dati esistenti nella tabella di importazione temporanea, eseguire i record per apportare modifiche o aggiornamenti. Potrebbe essere necessario importare prima i dati in una tabella temporanea nel caso in cui sia necessario verificare i dati o apportare ulteriori modifiche ai dati prima di archiviarli nella tabella permanente.

Attività flusso di dati – Spiegato nella sezione seguente.

 Fonte file flat –  Utilizzando i parametri del primo passaggio, il lavoro è in grado di accedere al file di testo.
Il file deve essere archiviato in un'unità di rete o in una cartella accessibile dal server.

Destinazione OLE DB  – Questo passaggio finale del lavoro è il processo che importa i dati nella tabella di SQL Server. Qui si identifica la connessione al database e il nome della tabella. È anche il punto in cui mapperai i campi dal file di testo ai campi di destinazione nella tabella.

Infine ho creato la stored procedure per restituire l'executionID. Lo scopo qui è che lo stored procedure non verrà chiuso fino al completamento del processo, impedendo al codice VBA di Microsoft Access di continuare fino al completamento del processo. L'idea del lavoro è solo quella di ottenere i dati in una tabella di SQL Server e una volta lì è possibile apportare modifiche ai dati tramite Access e infine archiviare i dati nella tabella permanente.

Da 20 minuti a 3!

Il nostro cliente è stato molto soddisfatto dei risultati, essere in grado di sfruttare la straordinaria tecnologia di SQL Server in combinazione con Access mi ha permesso di fare grandi passi avanti in termini di efficienza nel mio lavoro, non vedo l'ora di riprovare presto!

Unisciti a Susan Pyne il prossimo martedì 12 febbraio mentre discute come crittografare le colonne in SQL Server come carte di credito e numeri di previdenza sociale e come decrittografarle per visualizzarle in Access, ottimo per salvaguardare dati preziosi! Per saperne di più, visita https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption