Access
 sql >> Base de Dados >  >> RDS >> Access

Acesso com o Microsoft SQL Server – Importe grandes conjuntos de dados usando o SSIS

Acesso com o Microsoft SQL Server – Importar grandes conjuntos de dados usando SSIS

Morrendo com uma consulta de inserção de acesso


Se você já tentou inserir uma grande quantidade de registros no SQL Server usando uma consulta de inserção do Access (15.000 registros ou mais), terá uma longa espera, estava falando sobre o intervalo do café aqui (de alguns minutos a 15). Pode até fazer com que seu banco de dados trave se o conjunto de dados for muito grande. Então, quais opções você tem?

XML é uma ótima primeira tentativa


Um dos métodos que geralmente usamos em nosso código é trabalhar com dados XML, não vou entrar em muitos detalhes sobre isso aqui, mas aqui está um link que um colega meu escreveu. Abrange uma série de 2 partes que discute como trabalhar com dados XML com um back-end do SQL Server.

XML é uma ótima ferramenta para tentar, mas mesmo isso pode não ser rápido o suficiente com conjuntos de dados numerados na casa dos 10.000. No entanto, a vantagem do XML sobre um trabalho SSIS seria que um trabalho SSIS requer uma pasta de rede onde todos os usuários do Access e o servidor possam acessar. Isso não funcionaria bem na Internet (o cenário para o qual o método XML foi criado originalmente).

SSIS é super rápido


O que quero compartilhar com você aqui é sobre minha experiência trabalhando com o SQL Server Integration Services. Tínhamos um cliente cujo banco de dados já estava usando o método XML para enviar os dados para o servidor SQL, mas como os dados que estavam importando tinham mais de 700.000 linhas de dados, levava 20 minutos para concluir o processo. Isso estava claramente demorando muito para uma empresa ocupada que precisava usar esse método diariamente. Nossa solução foi remover o Access do processo de upload criando um trabalho que leria o arquivo CSV diretamente do local do arquivo e importaria os dados para a tabela do SQL Server usando um script T-SQL simples.

O acesso apenas inicia o processo


Os usuários selecionarão seu arquivo de dados no Access e inserirão qualquer outra informação necessária, como uma data, e clicarão no botão de processo. A primeira etapa do código vba seria armazenar o nome do arquivo e o caminho para uma tabela no SQL Server.
'Add import file name to Application
ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

Aqui está o código vba usado para executar o trabalho SSIS.
Public Function ImportData()
On Error GoTo ImportData_Err
Dim rs As ADODB.Recordset
Dim strSQL As String


‘Adicionar código para ativar o pacote SSIS
strSQL =“EXEC dbo.uspSSISFileDataImport”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

'O seguinte executa um procedimento para verificar se o trabalho foi concluído.
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True

Faça até rs.Fields(0) =4 e não IsNull(rs.Fields(3))
strSQL =“EXEC dbo.uspSSISFileDataImportProcess”
OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
Loop

ImportData_Exit:
Definir rs =Nothing
Função Sair

ImportData_Err:
MsgBox Err.Description
Resume ImportData_Exit
Resume ‘para depuração

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


EXECUTAR 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;


AGUARDE ATRASO '00:00:03';

SELECT @execution_id=MAX ([execution_id])
FROM [SSISDB].[interno].[execuções];

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;
Este procedimento armazenado executará um trabalho simples com o design a seguir.

 Obter parâmetros  – Este é um script T-SQL simples que seleciona o nome do arquivo e o caminho da tabela sql e atribui os valores aos respectivos parâmetros. SELECT SSISDataImportFile FROM tblApplicationSettings; O nome do arquivo seria diferente de dia para dia, portanto, usar um parâmetro era o caminho a seguir, o nome do arquivo é inserido em um objeto não vinculado no formulário de acesso e, com a codificação VBA, é salvo em uma tabela SQL, permitindo que o pacote leia isso de uma tabela SQL (veja o código acima).





Truncar a entrada de hoje – Um script T-SQL simples para remover quaisquer dados existentes na tabela de importação temporária, executado pelos registros para fazer alterações ou atualizações. Você pode precisar importar os dados primeiro para uma tabela temporária, caso precise verificar os dados ou fazer outras alterações nos dados antes de armazená-los na tabela permanente.

Tarefa de fluxo de dados – Explicado na seção a seguir.

 Fonte de arquivo simples –  Utilizando os parâmetros do primeiro passo, o trabalho pode acessar o arquivo de texto.
O arquivo precisa ser armazenado em uma unidade de rede ou em uma pasta acessível pelo servidor.

Destino OLE DB  – Esta etapa final do trabalho é o processo que importa os dados para a tabela do SQL Server. Aqui você identifica a conexão com o banco de dados e o nome da tabela. Também é onde você mapeará os campos do arquivo de texto para os campos de destino na tabela.

Por fim, criei o procedimento armazenado para retornar o executionID. O objetivo aqui é que o procedimento armazenado não seja encerrado até que o trabalho seja concluído, impedindo que o código VBA do Microsoft Access continue até que o trabalho seja concluído. A ideia do trabalho é apenas colocar os dados em uma tabela do SQL Server e uma vez lá você pode fazer qualquer modificação nos dados via Access e finalmente armazenar os dados na tabela permanente.

De 20 minutos a 3!


Nosso cliente ficou super feliz com os resultados, poder aproveitar a incrível tecnologia do SQL Server em conjunto com o Access está me permitindo dar grandes passos em eficiência no meu trabalho, mal posso esperar para tentar novamente em breve!



Junte-se a Susan Pyne na próxima terça-feira, 12 de fevereiro, enquanto ela discute como criptografar colunas no SQL Server, como cartões de crédito e números de previdência social, e como descriptografá-los para exibição no Access, ótimo para proteger dados valiosos! Para saber mais acesse https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption