实现方法

    • 通过ADO.NET SQLBulkCopy 方式
    • 通过JDBC SQLServerBulkCopy 方式
    1. SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
    2. copyOptions.setCheckConstraints(true);
    3. 测试时,请用Microsoft JDBC Drivers 6.0 sqljdbc41.jarsqljdbc4.jar及更老版本没有SQLServerBulkCopy 实现。
    4. 例如: 将本地的一个大表通过SQLServerBulkCopy方式导入到RDS的实例中
    5. import java.sql.*;
    6. import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
    7. import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
    8. public class Program {
    9. public static void main(String[] args)
    10. {
    11. String sourceConnectionString = "jdbc:sqlserver://localhost:1433;" +
    12. "databaseName=testdb;user=****;password=****";
    13. String destConnectionString = "jdbc:sqlserver://*****.sqlserver.rds.aliyuncs.com:3433;" +
    14. "databaseName=testdb;user=****;password=**** ";
    15. try
    16. {
    17. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    18. try (Connection sourceConnection =
    19. DriverManager.getConnection(sourceConnectionString))
    20. {
    21. try (Statement stmt = sourceConnection.createStatement())
    22. {
    23. try (ResultSet rsSourceData = stmt.executeQuery(
    24. " SELECT top 1000000 " +
    25. "[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName] ," +
    26. "[Suffix],[EmailPromotion],[AdditionalContactInfo]," +
    27. "[Demographics],NULL as rowguid,[ModifiedDate] " +
    28. try (Connection destinationConnection = DriverManager.getConnection(destConnectionString))
    29. {
    30. Statement stmt1 = destinationConnection.createStatement();
    31. long countStart = 0;
    32. try (ResultSet rsRowCount = stmt1.executeQuery(
    33. "SELECT COUNT(*) FROM dbo.Person;"))
    34. {
    35. rsRowCount.next();
    36. countStart = rsRowCount.getInt(1);
    37. System.out.println("Starting row count = " + countStart);
    38. }
    39. try (SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(destinationConnection))
    40. {
    41. SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
    42. copyOptions.setKeepIdentity(true);
    43. copyOptions.setBatchSize(2000);
    44. copyOptions.setBulkCopyTimeout(5000);
    45. //this is importance setting
    46. copyOptions.setCheckConstraints(true);
    47. bulkCopy.setBulkCopyOptions(copyOptions);
    48. bulkCopy.setDestinationTableName("dbo.Person");
    49. bulkCopy.addColumnMapping("PersonType", "PersonType");
    50. bulkCopy.addColumnMapping("NameStyle", "NameStyle");
    51. bulkCopy.addColumnMapping("Title", "Title");
    52. bulkCopy.addColumnMapping("FirstName", "FirstName");
    53. bulkCopy.addColumnMapping("MiddleName", "MiddleName");
    54. bulkCopy.addColumnMapping("LastName", "LastName");
    55. bulkCopy.addColumnMapping("Suffix", "Suffix");
    56. bulkCopy.addColumnMapping("EmailPromotion", "EmailPromotion");
    57. bulkCopy.addColumnMapping("AdditionalContactInfo", "AdditionalContactInfo");
    58. bulkCopy.addColumnMapping("rowguid", "rowguid");
    59. try
    60. {
    61. bulkCopy.writeToServer(rsSourceData);
    62. }
    63. catch (Exception e)
    64. {
    65. e.printStackTrace();
    66. }
    67. try (ResultSet rsRowCount = stmt1.executeQuery(
    68. "SELECT COUNT(*) FROM dbo.Person;"))
    69. {
    70. rsRowCount.next();
    71. long countEnd = rsRowCount.getInt(1);
    72. System.out.println("Ending row count = " + countEnd);
    73. System.out.println((countEnd - countStart) + " rows were added.");
    74. }
    75. }
    76. }
    77. }
    78. }
    79. }
    80. }
    81. catch (Exception e)
    82. {
    83. e.printStackTrace();
    84. }
    85. }
    86. }
    • 通过BCP方式

    第一步:需要将数据BCP到本地

    第二步:将导出的文件直接导入到RDS的实例中,但需要指定提示:/h “CHECK_CONSTRAINTS”

    1. BCP testdb.dbo.person In "bcp_data" /C /N /q /k /h "CHECK_CONSTRAINTS" /U *** /P *** /b 500 /S "***.sqlserver.rds.aliyuncs.com,3433"
    • 通过DTS/SSIS方式

    第二种:直接使用SQL Server Business Intelligence Development Stuidio新建 SSIS包:

    • 特别说明

    第一种:

    第二种:

    • 总结