Åtkomst med Microsoft SQL Server – Importera stora datamängder med SSIS
Dör med en Access Insert Query
Om du någonsin har försökt infoga en stor mängd poster i SQL Server med hjälp av en Access-infogningsfråga (15 000 poster eller mer), har du väntat länge, pratade om kafferast här, (från några minuter) till 15). Det kan till och med få din databas att hänga sig om datamängden är för stor. Så vilka alternativ har du?
XML är ett utmärkt första försök
En av metoderna vi generellt använder i vår kod är att arbeta med XML-data, jag ska inte gå in för mycket på det här, men här är en länk som en kollega till mig skrev. Den täcker en serie i två delar som diskuterar arbete med XML-data med en SQL Server-backend.
XML är ett bra verktyg att prova, men även det kanske inte är tillräckligt snabbt med datauppsättningar som numreras på 10 000-talet. Men fördelen med XML framför ett SSIS-jobb skulle vara att ett SSIS-jobb kräver en nätverksmapp dit alla Access-användare och servern kan nå. Det skulle inte fungera bra över internet (scenariot som XML-metoden ursprungligen skapades för).
SSIS är supersnabb
Det jag vill dela med dig här handlar om min erfarenhet av att arbeta med SQL Server Integration Services. Vi hade en klient vars databas redan använde XML-metoden för att ladda upp data till SQL-servern men eftersom data de importerade hade över 700 000 rader med data tog det 20 minuter att slutföra processen. Detta tog helt klart för lång tid för ett upptaget företag som behövde använda denna metod dagligen. Vår lösning var att ta bort Access från uppladdningsprocessen genom att skapa ett jobb som skulle läsa CSV-filen direkt från filplatsen och importera data till SQL Server-tabellen med ett enkelt T-SQL-skript.
Åtkomst startar bara processen
Användare väljer sin datafil i Access och matar in all annan nödvändig information, såsom ett datum, och klickar på processknappen. Det första steget i vba-koden skulle vara att lagra filnamnet och sökvägen till en tabell i SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)
Här är vba-koden som används för att sedan köra SSIS-jobbet.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String
‘Lägg till kod för att aktivera SSIS Package
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
"Följande slingrar en procedur för att kontrollera om jobbet har slutförts.
strSQL ="EXEC dbo.uspSSISFileDataImportProcess"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Gör tills rs.Fields(0) =4 And Not IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockRead
Slinga
ImportData_Exit:
Set rs =Nothing
Exit Function
ImportData_Err:
MsgBox Err.Description
Resume ImportData_Exit
Resume ‘for debugging
Slutfunktion
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;
UTFÖR 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;
WAITFOR DELAY ’00:00:03′;
VÄLJ @execution_id=MAX ([exekverings-id])
FRÅN [SSISDB].[internt].[körningar];
VÄLJ
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
FRÅN SSISDB .internal.executables AS e
VÄNSTER JOIN SSISDB.internal.executable_statistics AS s
PÅ e.executable_id =s.executable_id AND s.execution_id =@execution_id;
VÄLJ @JobStatusID, @JobStatus, @StartTime, @EndTime;
END;
Denna lagrade procedur kommer att köra ett enkelt jobb med följande design.
Hämta parametrar – Detta är ett enkelt T-SQL-skript som väljer filnamnet och sökvägen från SQL-tabellen och tilldelar värdena till respektive parametrar. VÄLJ SSISDataImportFile FROM tblApplicationSettings; Filnamnet skulle skilja sig från dag till dag så att använda en parameter var vägen att gå, filnamnet skrivs in i ett obundet objekt på åtkomstformuläret och sparas sedan med VBA-kodning i en SQL-tabell, vilket gör att paketet kan läsa detta från en SQL-tabell (se koden ovan).
Trunkera dagens indata – Ett enkelt T-SQL-skript för att ta bort befintliga data i den temporära importtabellen, köra igenom posterna för att göra ändringar eller uppdateringar. Du kan behöva importera data först till en tillfällig tabell om du behöver verifiera data eller göra ytterligare ändringar av data innan du lagrar i den permanenta tabellen.
Dataflödesuppgift – Förklaras i följande avsnitt.
Flat filkälla – Genom att använda parametrarna från det första steget kan jobbet komma åt textfilen.
Filen måste lagras i en nätverksenhet eller en mapp som är tillgänglig för servern.
OLE DB-destination – Det här sista steget i jobbet är processen som importerar data till SQL Server-tabellen. Här identifierar du databasanslutningen och tabellnamnet. Det är också där du mappar fälten från textfilen till destinationsfälten i tabellen.
Till slut skapade jag den lagrade proceduren för att returnera executionID. Syftet här är att den lagrade proceduren inte avslutas förrän jobbet har slutförts, vilket förhindrar att Microsoft Access VBA-koden fortsätter tills jobbet är klart. Tanken med jobbet är bara att få in data i en SQL Server-tabell och väl där kan du göra eventuella ändringar av data via Access och slutligen lagra data i den permanenta tabellen.
Från 20 minuter ner till 3!
Vår kund var supernöjd med resultaten, att kunna dra nytta av den fantastiska teknologin i SQL Server i kombination med Access gör att jag kan göra stora framsteg i effektiviteten på mitt jobb, kan inte vänta med att prova detta snart igen!
Följ med Susan Pyne nästa tisdag den 12 februari när hon diskuterar hur man krypterar kolumner i SQL Server som kreditkort och personnummer, och hur man dekrypterar dem för visning i Access, perfekt för att skydda värdefull data! För mer information besök https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption