Accès avec Microsoft SQL Server – Importer de grands ensembles de données à l'aide de SSIS
Mourir avec une requête d'insertion d'accès
Si vous avez déjà essayé d'insérer une grande quantité d'enregistrements dans SQL Server à l'aide d'une requête d'insertion Access, (15 000 enregistrements ou plus), vous êtes dans une longue attente, parlait de temps de pause-café ici, (à partir de quelques minutes à 15). Cela peut même entraîner le blocage de votre base de données si l'ensemble de données est trop volumineux. Alors, quelles options avez-vous ?
XML est une excellente première tentative
L'une des méthodes que nous utilisons généralement dans notre code consiste à travailler avec des données XML, je n'entrerai pas trop dans les détails à ce sujet ici, mais voici un lien qu'un de mes collègues a écrit. Il couvre une série en 2 parties qui explique comment travailler avec des données XML avec un backend SQL Server.
XML est un excellent outil à essayer, mais même cela peut ne pas être assez rapide avec des ensembles de données numérotés dans les 10 000. Cependant, l'avantage de XML par rapport à un travail SSIS serait qu'un travail SSIS nécessite un dossier réseau accessible à tous les utilisateurs d'Access et au serveur. Cela ne fonctionnerait pas bien sur Internet (le scénario pour lequel la méthode XML a été conçue à l'origine).
SSIS est super rapide
Ce que je veux partager avec vous ici concerne mon expérience de travail avec SQL Server Integration Services. Nous avions un client dont la base de données utilisait déjà la méthode XML pour télécharger les données sur le serveur SQL, mais comme les données qu'ils importaient comportaient plus de 700 000 lignes de données, il fallait 20 minutes pour terminer le processus. Cela prenait clairement trop de temps pour une entreprise très occupée qui devait utiliser cette méthode quotidiennement. Notre solution consistait à supprimer Access du processus de téléchargement en créant une tâche qui lirait le fichier CSV directement à partir de l'emplacement du fichier et importerait les données dans la table SQL Server à l'aide d'un simple script T-SQL.
L'accès ne fait que lancer le processus
Les utilisateurs sélectionneront leur fichier de données dans Access et saisiront toute autre information requise, telle qu'une date, puis cliqueront sur le bouton de traitement. La première étape du code vba serait de stocker le nom de fichier et le chemin d'accès à une table dans SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)
Voici le code vba utilisé pour exécuter ensuite la tâche SSIS.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String
'Ajouter du code pour activer le package SSIS
strSQL ="EXEC dbo.uspSSISFileDataImport"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
‘Ce qui suit boucle une procédure pour vérifier si le travail est terminé.
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Faire jusqu'à ce que rs.Fields(0) =4 et non IsNull(rs.Fields(3))
strSQL ="EXEC dbo.uspSSISFileDataImportProcess"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Boucle
ImportData_Exit :
Set rs =Nothing
Quitter la fonction
ImportData_Err :
MsgBox Err.Description
Reprendre ImportData_Exit
Reprendre "pour le débogage
End Function
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;
EXÉCUTER 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;
ATTENDRE LE DELAI '00:00:03′ ;
SELECT @execution_id=MAX ([execution_id])
FROM [SSISDB].[internal].[executions] ;
SELECT
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
FROM 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 ;
SELECT @JobStatusID, @JobStatus, @StartTime, @EndTime ;
END ;
Cette procédure stockée exécutera une tâche simple avec la conception suivante.
Obtenir les paramètres – Il s'agit d'un simple script T-SQL qui sélectionne le nom et le chemin du fichier dans la table sql et attribue les valeurs aux paramètres respectifs. SELECT SSISDataImportFile FROM tblApplicationSettings ; Le nom du fichier différait d'un jour à l'autre, donc l'utilisation d'un paramètre était la voie à suivre, le nom du fichier est entré dans un objet non lié sur le formulaire d'accès, puis avec le codage VBA est enregistré dans une table SQL, permettant au package de le lire à partir de une table SQL (voir code ci-dessus).
Tronquer l'entrée d'aujourd'hui - Un simple script T-SQL pour supprimer toutes les données existantes dans la table d'importation temporaire, parcourir les enregistrements pour apporter des modifications ou des mises à jour. Vous devrez peut-être d'abord importer les données dans une table temporaire au cas où vous auriez besoin de vérifier les données ou d'apporter d'autres modifications aux données avant de les stocker dans la table permanente.
Tâche de flux de données – Expliqué dans la section suivante.
Source de fichier plat – En utilisant les paramètres de la première étape, le travail peut accéder au fichier texte.
Le fichier doit être stocké sur un lecteur réseau ou un dossier accessible par le serveur.
Destination OLE DB – Cette dernière étape du travail est le processus qui importe les données dans la table SQL Server. Ici, vous identifiez la connexion à la base de données et le nom de la table. C'est également là que vous mapperez les champs du fichier texte aux champs de destination dans le tableau.
Enfin, j'ai créé la procédure stockée pour renvoyer l'executionID. Le but ici est que la procédure stockée ne se ferme pas tant que le travail n'est pas terminé, empêchant le code Microsoft Access VBA de continuer jusqu'à ce que le travail soit terminé. L'idée du travail est simplement d'obtenir les données dans une table SQL Server et une fois là-bas, vous pouvez apporter des modifications aux données via Access et enfin stocker les données dans la table permanente.
De 20 minutes à 3 !
Notre client était super content des résultats, pouvoir tirer parti de la formidable technologie de SQL Server en conjonction avec Access me permet de faire de grands progrès en termes d'efficacité dans mon travail, j'ai hâte de réessayer bientôt !
Rejoignez Susan Pyne le mardi 12 février prochain alors qu'elle explique comment chiffrer les colonnes dans SQL Server telles que les cartes de crédit et les numéros de sécurité sociale, et comment les déchiffrer pour les afficher dans Access, idéal pour protéger des données précieuses ! Pour en savoir plus, rendez-vous sur https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption