sql >> Database >  >> RDS >> Access

Toegang met Microsoft SQL Server – Importeer grote datasets met SSIS

Toegang met Microsoft SQL Server – Importeer grote datasets met SSIS

Sterven met een Access Insert Query

Als u ooit hebt geprobeerd een groot aantal records in SQL Server in te voegen met behulp van een Access-insertquery (15.000 records of meer), wacht u lang, u had het hier over koffiepauzetijd (van een paar minuten tot 15). Het kan er zelfs voor zorgen dat uw database vastloopt als de dataset te groot is. Dus welke opties heb je?

XML is een geweldige eerste poging

Een van de methoden die we over het algemeen in onze code gebruiken, is om met XML-gegevens te werken, daar zal ik hier niet te veel op ingaan, maar hier is een link die een collega van mij schreef. Het omvat een 2-delige serie die het werken met XML-gegevens met een SQL Server-backend bespreekt.

XML is een geweldig hulpmiddel om te proberen, maar zelfs dat is misschien niet snel genoeg met datasets die nummeren in de 10.000. Het voordeel van XML ten opzichte van een SSIS-taak zou echter zijn dat een SSIS-taak een netwerkmap vereist waar alle Access-gebruikers en de server toegang toe hebben. Dat zou niet goed werken via internet (het scenario waarvoor de XML-methode oorspronkelijk was gemaakt).

SSIS is supersnel

Wat ik hier met u wil delen, is mijn ervaring met het werken met SQL Server Integration Services. We hadden een klant wiens database al de XML-methode gebruikte om de gegevens naar de SQL-server te uploaden, maar omdat de gegevens die ze importeerden meer dan 700.000 rijen gegevens bevatten, duurde het 20 minuten om het proces te voltooien. Dit duurde duidelijk te lang voor een druk bedrijf dat deze methode dagelijks moest gebruiken. Onze oplossing was om Access uit het uploadproces te verwijderen door een taak te maken die het CSV-bestand rechtstreeks vanaf de bestandslocatie zou lezen en de gegevens zou importeren in de SQL Server-tabel met behulp van een eenvoudig T-SQL-script.

Toegang begint pas met het proces

Gebruikers selecteren hun gegevensbestand in Access en voeren eventuele andere vereiste informatie in, zoals een datum, en klikken op de procesknop. De eerste stap van de vba-code zou zijn om de bestandsnaam en het pad naar een tabel in SQL Server op te slaan.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

Hier is de vba-code die wordt gebruikt om vervolgens de SSIS-taak uit te voeren.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String

'Voeg code toe om SSIS-pakket te activeren
strSQL ="EXEC dbo.uspSSISFileDataImport"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

'De volgende lus een procedure om te controleren of de taak is voltooid.
strSQL ="EXEC dbo.uspSSISFileDataImportProcess"
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

Doen tot rs.Fields(0) =4 And Not IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
> Loop

ImportData_Exit:
Stel rs =Nothing in
Exit-functie

ImportData_Err:
MsgBox Err.Description
Hervat ImportData_Exit
Hervat 'voor foutopsporing

Functie beëindigen
CREATE PROCEDURE [dbo].[uspFileDataImport]
AS
BEGIN
SET NOCOUNT ON;

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

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

WACHTVERTRAGING '00:00:03′;

SELECT @execution_id=MAX ([execution_id])
FROM [SSISDB].[intern].[executions];

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

SELECT @JobStatusID, @JobStatus, @StartTime, @EndTime;
END;
Deze opgeslagen procedure voert een eenvoudige taak uit met het volgende ontwerp.

 Parameters ophalen  – Dit is een eenvoudig T-SQL-script dat de bestandsnaam en het pad uit de sql-tabel selecteert en de waarden aan de respectieve parameters toewijst. SELECTEER SSISDataImportFile VANUIT tblApplicationSettings; De bestandsnaam zou van dag tot dag verschillen, dus het gebruik van een parameter was de beste keuze, de bestandsnaam wordt ingevoerd in een ongebonden object op het toegangsformulier en wordt vervolgens met VBA-codering opgeslagen in een SQL-tabel, zodat het pakket dit kan lezen van een SQL-tabel (zie bovenstaande code).

De invoer van vandaag afkappen – Een eenvoudig T-SQL-script om bestaande gegevens in de tijdelijke importtabel te verwijderen, door de records te lopen om wijzigingen of updates aan te brengen. Mogelijk moet u de gegevens eerst in een tijdelijke tabel importeren voor het geval u de gegevens moet verifiëren of verdere wijzigingen aan de gegevens moet aanbrengen voordat u ze in de permanente tabel opslaat.

Gegevensstroomtaak – Uitgelegd in het volgende gedeelte.

 Flat bestandsbron –  Met behulp van de parameters uit de eerste stap kan de taak toegang krijgen tot het tekstbestand.
Het bestand moet worden opgeslagen op een netwerkstation of een map die toegankelijk is voor de server.

OLE DB-bestemming  – Deze laatste stap van de taak is het proces dat de gegevens in de SQL Server-tabel importeert. Hier identificeert u de databaseverbinding en de tabelnaam. Het is ook de plaats waar u de velden uit het tekstbestand aan de bestemmingsvelden in de tabel toewijst.

Ten slotte heb ik de opgeslagen procedure gemaakt om de uitvoerings-ID terug te geven. Het doel hier is dat de opgeslagen procedure niet wordt afgesloten totdat de taak is voltooid, waardoor wordt voorkomen dat de Microsoft Access VBA-code wordt voortgezet totdat de taak is voltooid. Het idee van de taak is om de gegevens in een SQL Server-tabel te krijgen en eenmaal daar kunt u via Access eventuele wijzigingen aan de gegevens aanbrengen en de gegevens uiteindelijk opslaan in de permanente tabel.

Van 20 minuten tot 3!

Onze klant was super blij met de resultaten. Doordat ik de geweldige technologie van SQL Server in combinatie met Access kan gebruiken, kan ik grote stappen maken in efficiëntie in mijn werk, ik kan niet wachten om dit binnenkort opnieuw te proberen!

Sluit je aan bij Susan Pyne aanstaande dinsdag 12 februari terwijl ze bespreekt hoe kolommen in SQL Server, zoals creditcards en burgerservicenummers, kunnen worden versleuteld en hoe ze kunnen worden ontsleuteld voor weergave in Access, ideaal voor het beschermen van waardevolle gegevens! Ga voor meer informatie naar https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption


  1. RIJEN ophalen als KOLOMMEN (SQL Server dynamische PIVOT-query)

  2. Gegevens ophalen uit opgeslagen procedure met Entity Framework

  3. Hoe SQL-databases te verbergen waartoe een gebruiker geen toegang heeft?

  4. Gebruik SERVERPROPERTY() om serverinformatie op te halen in SQL Server