sql >> データベース >  >> RDS >> Access

Microsoft SQL Serverによるアクセス–SSISを使用した大規模なデータセットのインポート

    Microsoft SQL Serverでのアクセス–SSISを使用した大規模なデータセットのインポート

    アクセス挿入クエリで死ぬ

    Access挿入クエリ(15,000レコード以上)を使用してSQL Serverに大量のレコードを挿入しようとしたことがある場合は、長い間待機していて、ここでコーヒーブレイクタイムについて話していました(数分から) 15まで)。データセットが大きすぎると、データベースがハングする可能性もあります。では、どのようなオプションがありますか?

    XMLは素晴らしい最初の試みです

    コードで一般的に使用する方法の1つは、XMLデータを操作することです。ここではあまり詳しく説明しませんが、私の同僚が書いたリンクを次に示します。 SQLServerバックエンドでのXMLデータの操作について説明する2部構成のシリーズをカバーしています。

    XMLは試してみるのに最適なツールですが、データセットの番号が10,000である場合でも、十分な速度ではない可能性があります。ただし、SSISジョブに対するXMLの利点は、SSISジョブには、すべてのAccessユーザーとサーバーが到達できるネットワークフォルダーが必要なことです。これはインターネットではうまく機能しません(XMLメソッドが最初に作成されたシナリオ)。

    SSISは非常に高速です

    ここで共有したいのは、SQL ServerIntegrationServicesでの私の経験についてです。データベースがすでにXMLメソッドを使用してSQLサーバーにデータをアップロードしているクライアントがありましたが、インポートするデータには700,000行を超えるデータが含まれていたため、プロセスを完了するのに20分かかりました。これは、この方法を毎日使用する必要がある忙しい会社にとって明らかに時間がかかりすぎていました。私たちの解決策は、ファイルの場所からCSVファイルを直接読み取り、単純なT-SQLスクリプトを使用してデータをSQL Serverテーブルにインポートするジョブを作成することにより、アップロードプロセスからAccessを削除することでした。

    アクセスはプロセスを開始するだけです

    ユーザーはAccessでデータファイルを選択し、日付などの他の必要な情報を入力して、プロセスボタンをクリックします。 vbaコードの最初のステップは、ファイル名とパスをSQLServerのテーブルに保存することです。
    'Add import file name to Application
    ExecuteMyCommand "UPDATE Application SET SSISDataImportFile = " & PrepareSQLString(Me.txtFileInput)

    これは、SSISジョブを実行するために使用されるvbaコードです。
    Public Function ImportData()
    On Error GoTo ImportData_Err
    Dim rs As ADODB.Recordset
    Dim strSQL As String

    ‘SSISパッケージをアクティブ化するコードを追加
    strSQL =“ EXEC dbo.uspSSISFileDataImport”
    OpenMyRecordset rs、strSQL、rrOpenForwardOnly、rrLockReadOnly、True

    ‘以下は、ジョブが完了したかどうかを確認する手順をループします。
    strSQL =“ EXEC dbo.uspSSISFileDataImportProcess”
    OpenMyRecordset rs、strSQL、rrOpenForwardOnly、rrLockReadOnly、True

    rs.Fields(0)=4であり、IsNull(rs.Fields(3))ではないまで実行
    strSQL =“ EXEC dbo.uspSSISFileDataImportProcess”
    OpenMyRecordset rs、strSQL、rrOpenForwardOnly、rrLockReadOnly、True
    ループ

    ImportData_Exit:
    Set rs =Nothing
    Exit Function

    ImportData_Err:
    MsgBox Err.Description
    ImportData_Exitを再開します
    「デバッグのために」再開します

    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])
    FROM[SSISDB]。[internal]。[executions];

    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;
    このストアドプロシージャは、次のデザインの単純なジョブを実行します。

    パラメータを取得 –これは、SQLテーブルからファイル名とパスを選択し、それぞれのパラメーターに値を割り当てる単純なT-SQLスクリプトです。 SELECT SSISDataImportFile FROM tblApplicationSettings;ファイル名は日々異なるため、パラメータを使用してアクセスフォームのバインドされていないオブジェクトにファイル名を入力し、VBAコーディングを使用してSQLテーブルに保存し、パッケージがこれを読み取ることができるようにします。 SQLテーブル(上記のコードを参照)。

    今日の入力を切り捨てる –一時インポートテーブル内の既存のデータを削除し、レコードを実行して変更または更新を行うための単純なT-SQLスクリプト。永続テーブルに保存する前にデータを確認したり、データにさらに変更を加えたりする必要がある場合に備えて、最初にデータを一時テーブルにインポートする必要がある場合があります。

    データフロータスク –次のセクションで説明します。

    フラットファイルソース– 最初のステップのパラメータを使用して、ジョブはテキストファイルにアクセスできます。
    ファイルは、ネットワークドライブまたはサーバーからアクセスできるフォルダに保存する必要があります。

    OLEDBの宛先 –ジョブのこの最後のステップは、データをSQLServerテーブルにインポートするプロセスです。ここでは、データベース接続とテーブル名を識別します。また、テキストファイルのフィールドをテーブルの宛先フィールドにマップする場所でもあります。

    最後に、executionIDを返すストアドプロシージャを作成しました。ここでの目的は、ジョブが完了するまでストアドプロシージャが終了しないため、ジョブが完了するまでMicrosoftAccessVBAコードが続行されないようにすることです。このジョブの目的は、データをSQL Serverテーブルに取得することです。そこで、Accessを介してデータに変更を加え、最終的にデータを永続テーブルに格納できます。

    20分から3分まで!

    クライアントは結果に非常に満足しており、SQL ServerのすばらしいテクノロジーをAccessと組み合わせて活用できることで、仕事の効率が大幅に向上しました。すぐにもう一度試すのが待ちきれません!

    来週の2月12日火曜日にスーザンパインに参加して、クレジットカードや社会保障番号などのSQL Serverの列を暗号化する方法と、貴重なデータを保護するのに最適なAccessで表示するためにそれらを復号化する方法について説明します。詳細については、https://buff.ly/2I7BPii #MSAccess @MSAccess #Encryption

    にアクセスしてください。
    1. SQL Server(T-SQL)で「時刻」を「日時」に変換する例

    2. Ubuntu16.04にMySQLWorkbenchをインストールして構成する

    3. 上位nパーセント上位n%

    4. SQLServerイベントをキャプチャして分析する方法