すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS for SQL Server インスタンスに一度に複数のデータレコードをインポートするにはどうすればよいですか?

最終更新日:Apr 28, 2025

このトピックでは、一度に複数のデータレコードを ApsaraDB RDS for SQL Server インスタンスにインポートするために使用できる方法について説明します。インポート方法には、Database Management (DBS) のデータインポート機能、bcp ユーティリティ、Java Database Connectivity (JDBC) 用の SQLServerBulkCopy、および ADO.NET SQLBulkCopy が含まれます。

説明

以下の点にご注意ください。

  • Alibaba Cloud インスタンスの構成やデータの変更など、リスクの高い操作を実行する前に、データのセキュリティを確保するために、インスタンスのディザスタリカバリ機能とフォールトトレランス機能を確認することをお勧めします。

  • Elastic Compute Service (ECS) インスタンスや RDS インスタンスなどのインスタンスの構成またはデータを変更する前に、インスタンスのスナップショットを作成するか、インスタンスのバックアップを有効にすることをお勧めします。たとえば、RDS インスタンスのログバックアップを有効にすることができます。

  • 機密情報への権限を付与した場合、または Alibaba Cloud 管理コンソールで機密情報を送信した場合は、できるだけ早く機密情報を変更することをお勧めします。機密情報には、ユーザー名とパスワードが含まれます。

使用方法

ApsaraDB RDS for SQL Server では、BULK INSERT 文を実行して、一度に複数のデータレコードをインポートできます。ただし、SQL Server 2008 R2 を実行している RDS インスタンスでこの文を実行すると、バグが発生します。このバグを防ぐには、文を実行するときに CHECK 制約を有効にする必要があります。詳細については、「一括インポート操作による制約チェックの制御」をご参照ください。

CHECK 制約 を有効にする方法は、インポート方法によって異なります。

  • bcp ユーティリティを使用する場合は、必要なコマンドに /h "CHECK_CONSTRAINTS" を含める必要があります。

  • JDBC ドライバーの SQLServerBulkCopy クラスを使用する場合は、SQLServerBulkCopyOptionssetCheckConstraints(true) を指定する必要があります。

  • ADO.NET フレームワークの SqlBulkCopy クラスを使用する場合は、コンストラクター関数で SqlBulkCopyOptions.CheckConstraints を指定する必要があります。

方法 1: DMS のデータインポート機能を使用する

DMS の データインポート 機能を使用して、一度に複数のデータファイルを RDS for SQL Server インスタンスにインポートできます。この方法でインポートできるのは、SQL スクリプトCSV ファイル、または Excel ファイルのみです。

方法 2: bcp ユーティリティを使用する

bcp ユーティリティを使用して XML ファイルを生成し、生成されたファイルを使用して、一度に複数のデータファイルを RDS インスタンスにインポートできます。

  1. 次のコマンドを実行して、XML ファイルを生成します。

    bcp [データベース名].[アーキテクチャ].テーブル名 format nul /c /t"," /x /f "パス\XMLファイル名.xml" /U ユーザー名 /P パスワード /S "サーバーアドレス,ポート"

    コマンド例:

    bcp jacky.dbo.my_bcp_test format nul /c /t"," /x /f "d:\tmp\my_bcp_test.xml"  /U jacky /P xxxx /S "xxx.sqlserver.rds.aliyuncs.com,3333"
  2. 次のコマンドを実行して、データをインポートします。

    bcp [データベース名].[アーキテクチャ].テーブル名 in "データファイルへのパス" /f "生成された XML ファイルへのパス" /q /k /h "CHECK_CONSTRAINTS" /U ユーザー名 /P パスワード /S "サーバーアドレス,ポート"

    コマンド例:

    bcp jacky.dbo.my_bcp_test in "d:\tmp\my_test_data_file.txt" /f "d:\tmp\my_bcp_test.xml"  /q /k /h "CHECK_CONSTRAINTS"  /U jacky /P xxx /S "rm-bp1sc****.sqlserver.rds.aliyuncs.com, 1433"

方法 3: JDBC SQLServerBulkCopy を使用する

SQLServerBulkCopy クラスを使用して、一度に複数のデータレコードをインポートします。

SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
                        copyOptions.setCheckConstraints(true);
説明

詳細については、「JDBC ドライバーで大容量コピーを使用する」をご参照ください。

方法 4: ADO.NET SQLBulkCopy を使用する

ADO.NET フレームワークの SQLServerBulkCopy クラスを使用して、一度に複数のデータレコードをインポートします。

static void Main()
        {

            string srcConnString = "Data Source=(local);Integrated Security=true;Initial Catalog=testdb";
            string desConnString = "Data Source=****.sqlserver.rds.aliyuncs.com,3433;User ID=**;Password=**;Initial Catalog=testdb";

            SqlConnection srcConnection = new SqlConnection();
            SqlConnection desConnection = new SqlConnection();

            SqlCommand sqlcmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable dt = new DataTable();

            srcConnection.ConnectionString = srcConnString;
            desConnection.ConnectionString = desConnString;
            sqlcmd.Connection = srcConnection;

            // 日本語コメント:Person テーブルから上位 1,000,000 件のデータを取得するクエリ
            sqlcmd.CommandText = @"SELECT top 1000000 [PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion]
                             ,[AdditionalContactInfo],[Demographics],NULL as rowguid,[ModifiedDate] FROM [testdb].[dbo].[Person]";
            sqlcmd.CommandType = CommandType.Text;
            sqlcmd.Connection.Open();
            da.SelectCommand = sqlcmd;
            da.Fill(dt);


            using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.CheckConstraints))
            //using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.Default))
            {
                blkcpy.BatchSize = 2000;
                blkcpy.BulkCopyTimeout = 5000;
                blkcpy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
                blkcpy.NotifyAfter = 2000;

                foreach (DataColumn dc in dt.Columns)
                {
                    blkcpy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                }

                try
                {
                    blkcpy.DestinationTableName = "Person";
                    blkcpy.WriteToServer(dt);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    sqlcmd.Clone();
                    srcConnection.Close();
                    desConnection.Close();

                }
            }

        }

        private static void OnSqlRowsCopied(
            object sender, SqlRowsCopiedEventArgs e)
        {
            Console.WriteLine("Copied {0} so far...", e.RowsCopied); // 日本語コメント:コピーされた行数を表示
        }

参照

データ移行と同期

適用範囲

ApsaraDB RDS for SQL Server