本文介紹向RDS SQL Server資料庫大量匯入資料的四種方式,分別為通過DMS資料匯入功能、BCP命令方式、JDBC SQLBulkCopy方式和ADO.NET SQLBulkCopy方式。
背景資訊
雲資料庫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。
方式一:DMS資料匯入功能
通過阿里雲DMS的資料匯入功能將資料大量匯入RDS SQL Server資料庫中,目前僅支援SQL、CSV、Excel三種檔案格式。
方式二:通過BCP命令方式
通過BCP命令產生一個XML格式檔案,並利用產生的格式檔案將資料檔案大量匯入資料庫。
產生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"匯入資料,命令如下:
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);
}相關文檔
適用於
雲資料庫RDS SQL Server版