Adgang med Microsoft SQL Server – Importer store datasæt ved hjælp af SSIS
Dying with a Access Insert Query
Hvis du nogensinde har prøvet at indsætte en stor mængde poster i SQL Server ved hjælp af en Access-indsættelsesforespørgsel (15.000 poster eller mere), venter du længe, talte kaffepausetid her, (fra et par minutter) til 15). Det kan endda få din database til at hænge, hvis datasættet er for stort. Så hvilke muligheder har du?
XML er et fantastisk første forsøg
En af de metoder vi generelt bruger i vores kode er at arbejde med XML-data, det vil jeg ikke gå for meget i detaljer om her, men her er et link som en kollega af mig skrev. Den dækker en serie i 2 dele, der diskuterer arbejde med XML-data med en SQL Server-backend.
XML er et fantastisk værktøj at prøve, men selv det er måske ikke hurtigt nok med datasæt nummereret i 10.000'erne. Men fordelen ved XML i forhold til et SSIS-job ville være, at et SSIS-job kræver en netværksmappe, hvor alle Access-brugere og serveren kan nå. Det ville ikke fungere godt over internettet (det scenarie, som XML-metoden oprindeligt blev lavet til).
SSIS er superhurtigt
Det, jeg vil dele med dig her, handler om min erfaring med at arbejde med SQL Server Integration Services. Vi havde en klient, hvis database allerede brugte XML-metoden til at uploade dataene til SQL-serveren, men fordi de data, de importerede, havde over 700.000 rækker af data, tog det 20 minutter at fuldføre processen. Dette tog tydeligvis for lang tid for en travl virksomhed, der skulle bruge denne metode dagligt. Vores løsning var at fjerne Access fra uploadprocessen ved at oprette et job, der ville læse CSV-filen direkte fra filplaceringen og importere dataene til SQL Server-tabellen ved hjælp af et simpelt T-SQL-script.
Adgang starter kun processen
Brugere vil vælge deres datafil i Access og indtaste eventuelle andre nødvendige oplysninger, såsom en dato, og klikke på procesknappen. Det første trin i vba-koden ville være at gemme filnavnet og stien til en tabel i SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)
Her er vba-koden, der bruges til derefter at udføre SSIS-jobbet.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String
‘Tilføj kode for at aktivere SSIS Package
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
'Følgende gennemgår en procedure for at kontrollere, om jobbet er fuldført.
strSQL ="EXEC dbo.uspSSISFileDataImportProcess"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Gør indtil rs.Fields(0) =4 And Not IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockRead
Løkke
ImportData_Exit:
Indstil rs =Intet
Exit-funktion
ImportData_Err:
MsgBox Err.Description
Genoptag ImportData_Exit
Genoptag 'til fejlretning
Slutfunktion
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;
UDFØR msdb.dbo.sp_start_job @Job_name =N’SSISDataImport’;
SLUT;
CREATE PROCEDURE [dbo].[uspSSISFileDataImportProcess]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@execution_id INT,
@JobStatusID INT,
@JobStatus Varchar(250),
@StartTime DATETIME2,
@EndTime DATETIME2;
WAITFOR DELAY ’00:00:03′;
VÆLG @execution_id=MAX ([execution_id])
FRA [SSISDB].[intern].[executions];
VÆLG
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
FRA SSISDB .internal.executables AS e
VENSTRE JOIN SSISDB.internal.executable_statistics AS s
PÅ e.executable_id =s.executable_id OG s.execution_id =@execution_id;
VÆLG @JobStatusID, @JobStatus, @StartTime, @EndTime;
END;
Denne lagrede procedure vil køre et simpelt job med følgende design.
Hent parametre – Dette er et simpelt T-SQL-script, der vælger filnavnet og stien fra sql-tabellen og tildeler værdierne til respektive parametre. VÆLG SSISDataImportFile FRA tblApplicationSettings; Filnavnet ville variere fra dag til dag, så brug af en parameter var vejen at gå, filnavnet indtastes i et ubundet objekt på adgangsformularen og gemmes derefter med VBA-kodning i en SQL-tabel, hvilket gør det muligt for pakken at læse dette fra en SQL-tabel (se kode ovenfor).
Trunker dagens input – Et simpelt T-SQL-script til at fjerne eksisterende data i den midlertidige importtabel, køre gennem posterne for at foretage ændringer eller opdateringer. Du skal muligvis først importere dataene til en midlertidig tabel, hvis du har brug for at verificere dataene eller foretage yderligere ændringer af dataene, før du gemmer dem i den permanente tabel.
Dataflowopgave – Forklaret i det følgende afsnit.
Flad filkilde – Ved at bruge parametrene fra det første trin kan jobbet få adgang til tekstfilen.
Filen skal gemmes på et netværksdrev eller en mappe, som serveren har adgang til.
OLE DB-destination – Dette sidste trin af jobbet er processen, der importerer dataene til SQL Server-tabellen. Her identificerer du databaseforbindelsen og tabelnavnet. Det er også her, du vil kortlægge felterne fra tekstfilen til destinationsfelterne i tabellen.
Til sidst oprettede jeg den lagrede procedure for at returnere executionID. Formålet her er, at den lagrede procedure ikke afsluttes, før jobbet er fuldført, hvilket forhindrer Microsoft Access VBA-koden i at fortsætte, indtil jobbet er fuldført. Ideen med jobbet er bare at få dataene ind i en SQL Server-tabel, og når du først er der, kan du foretage eventuelle ændringer af dataene via Access og til sidst gemme dataene i den permanente tabel.
Fra 20 minutter ned til 3!
Vores klient var super tilfreds med resultaterne, at kunne udnytte den fantastiske teknologi i SQL Server sammen med Access giver mig mulighed for at gøre store fremskridt med hensyn til effektivitet på mit job, kan ikke vente med at prøve dette igen snart!
Slut dig til Susan Pyne næste tirsdag den 12. februar, hvor hun diskuterer, hvordan man krypterer kolonner i SQL Server, såsom kreditkort og personnumre, og hvordan man dekrypterer dem til visning i Access, fantastisk til at beskytte værdifulde data! For at lære mere, besøg venligst https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption