本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

如何向RDS SQL Server大量匯入資料

更新時間:2025-01-22 19:10

本文介紹向RDS SQL Server資料庫大量匯入資料的三種方式,分別是通過BCP命令方式、通過JDBC SQLBulkCopy方式、通過ADO.NET SQLBulkCopy方式。

說明

阿里雲提醒您:

  • 如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。

  • 如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。

  • 如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。

背景資訊

雲資料庫RDS SQL Server版支援Bulk Insert大量匯入資料,但是存在一定限制,限制原因是因為會觸發RDS SQL Server 2008 R2版本執行個體的一個Bug,需要在使用時將CheckConstraints選項開啟

本文提供的三種資料匯入方法中,開啟CheckConstraints的方式各不相同:

  • 使用BCP命令列工具時,需要在命令中包含/h "CHECK_CONSTRAINTS"參數。

  • 使用JDBC的SQLServerBulkCopy類時,需要通過SQLServerBulkCopyOptions設定setCheckConstraints(true)

  • 使用ADO.NET的SqlBulkCopy類時,需在建構函式中指定SqlBulkCopyOptions.CheckConstraints

方式一:通過BCP命令方式

通過BCP命令產生一個XML格式檔案,並利用產生的格式檔案將資料檔案大量匯入資料庫。

  1. 產生XML格式檔案,命令如下:

    bcp [資料庫名].[架構名].表名 format nul /c /t"," /x /f "路徑\格式檔案名稱.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 "格式檔案路徑" /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"

方式二:通過JDBC SQLBulkCopy方式

使用SQLServerBulkCopy類來實現資料的大量匯入。

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

更多詳情,請參見通過JDBC驅動程式使用大量複製

方式三:通過ADO.NET SQLBulkCopy方式

通過ADO.NET架構中的SQLBulkCopy方式實現資料大量匯入。

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;

            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);
        }

相關文檔

SQL Server資料移轉與同步方案

適用於

雲資料庫RDS SQL Server版

  • 本頁導讀 (1, M)
  • 背景資訊
  • 方式一:通過BCP命令方式
  • 方式二:通過JDBC SQLBulkCopy方式
  • 方式三:通過ADO.NET SQLBulkCopy方式
  • 相關文檔
  • 適用於
文檔反饋