sql >> Databáze >  >> RDS >> Access

Přístup pomocí Microsoft SQL Server – import velkých datových sad pomocí SSIS

Přístup pomocí Microsoft SQL Server – import velkých datových sad pomocí SSIS

Umírání s dotazem Access Insert

Pokud jste se někdy pokusili vložit velké množství záznamů do SQL Serveru pomocí Accessového vkládacího dotazu (15 000 záznamů nebo více), čekáte dlouho, mluvili jste o přestávce na kávu (od několika minut do 15). Může to dokonce způsobit, že se vaše databáze zablokuje, pokud je datová sada příliš velká. Jaké tedy máte možnosti?

XML je skvělý první pokus

Jednou z metod, kterou obecně používáme v našem kódu, je práce s XML daty, o tom se zde nebudu příliš rozepisovat, ale zde je odkaz, který napsal můj kolega. Zahrnuje dvoudílnou sérii, která pojednává o práci s daty XML s backendem SQL Server.

XML je skvělý nástroj k vyzkoušení, ale ani to nemusí být dostatečně rychlé s datovými sadami čítajícími 10 000. Výhodou XML oproti úloze SSIS by však bylo, že úloha SSIS vyžaduje síťovou složku, kam se mohou dostat všichni uživatelé Accessu a server. To by přes internet dobře nefungovalo (scénář, pro který byla metoda XML původně vytvořena).

SSIS je super rychlý

Zde se s vámi chci podělit o své zkušenosti s prací se službami SQL Server Integration Services. Měli jsme klienta, jehož databáze již používala metodu XML k nahrávání dat na SQL server, ale protože data, která importovali, měla více než 700 000 řádků dat, dokončení procesu trvalo 20 minut. To očividně trvalo příliš dlouho pro vytíženou společnost, která potřebovala tuto metodu používat denně. Naším řešením bylo odstranit Access z procesu nahrávání vytvořením úlohy, která by četl soubor CSV přímo z umístění souboru a importoval data do tabulky serveru SQL pomocí jednoduchého skriptu T-SQL.

Přístup pouze zahájí proces

Uživatelé vyberou svůj datový soubor v Accessu a zadají jakékoli další požadované informace, jako je datum, a kliknou na tlačítko procesu. Prvním krokem kódu vba by bylo uložení názvu souboru a cesty k tabulce na SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

Zde je kód vba použitý k provedení úlohy SSIS.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String

‘Přidat kód pro aktivaci balíčku SSIS
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

‘Následující smyčka zacyklí proceduru pro kontrolu, zda byla úloha dokončena.
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

Do dokud rs.Fields(0) =4 A není IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Smyčka

ImportData_Exit:
Set rs =Nothing
Exit Function

ImportData_Err:
MsgBox Err.Description
Obnovit ImportData_Exit
Obnovit ‘pro ladění

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

EXECUTE 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′;

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

SELECT
@JobStatusID =e.executable_id,
@JobStatus =e.executable_name,
@StartTime =s.start_time,
@EndTime =s.end_time
Z SSISDB .internal.executables AS e
VLEVO PŘIPOJIT SE 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;
Tato uložená procedura spustí jednoduchou úlohu s následujícím designem.

 Získat parametry  – Jedná se o jednoduchý skript T-SQL, který vybere název souboru a cestu ze sql tabulky a přiřadí hodnoty příslušným parametrům. VYBERTE SSISDataImportFile Z tblApplicationSettings; Název souboru by se den ode dne lišil, takže cesta byla pomocí parametru, název souboru se zadá do nesvázaného objektu na přístupovém formuláři a poté se s kódováním VBA uloží do tabulky SQL, což balíčku umožní, aby to četl SQL tabulka (viz kód výše).

Zkrácení dnešního vstupu – Jednoduchý skript T-SQL pro odstranění jakýchkoli existujících dat v tabulce dočasného importu, procházení záznamů a provádění změn nebo aktualizací. Možná budete muset nejprve importovat data do dočasné tabulky pro případ, že potřebujete ověřit data nebo v nich provést další změny před uložením do trvalé tabulky.

Úloha toku dat – Vysvětleno v následující části.

 Zdroj jednoduchého souboru –  Pomocí parametrů z prvního kroku má úloha přístup k textovému souboru.
Soubor musí být uložen na síťovém disku nebo ve složce, která je přístupná serveru.

Cíl OLE DB  – Tento poslední krok úlohy je proces, který importuje data do tabulky SQL Serveru. Zde určíte připojení k databázi a název tabulky. Je to také místo, kde budete mapovat pole z textového souboru na cílová pole v tabulce.

Nakonec jsem vytvořil uloženou proceduru pro vrácení exekučního ID. Účelem je, že uložená procedura nebude ukončena, dokud nebude úloha dokončena, což zabrání pokračování kódu Microsoft Access VBA, dokud nebude úloha dokončena. Myšlenka této práce je pouze dostat data do tabulky SQL Serveru a jakmile tam budete, můžete provádět jakékoli úpravy dat prostřednictvím Accessu a nakonec data uložit do trvalé tabulky.

Z 20 minut dolů na 3!

Náš klient byl s výsledky velmi spokojený, možnost využít úžasnou technologii SQL Serveru ve spojení s Access mi umožňuje dělat velké pokroky v efektivitě v mé práci. Nemůžu se dočkat, až to brzy zkusím znovu!

Připojte se k Susan Pyne příští úterý 12. února, když diskutuje o tom, jak šifrovat sloupce na serveru SQL Server, jako jsou kreditní karty a čísla sociálního pojištění, a jak je dešifrovat pro zobrazení v Accessu, což je skvělé pro ochranu cenných dat! Chcete-li se dozvědět více, navštivte https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption


  1. Převeďte BufferedInputStream na obrázek

  2. Osvědčené postupy při škálování databází:Část 1

  3. SQLite – ORDER BY RAND()

  4. Klauzule SQL WHERE porovnává hodnoty s koncovými mezerami