Kopiowanie dużej ilości danych z jednego źródła do drugiego

Jak sprawnie i szybko przekopiować dane z tabeli do tabeli? Można wykorzystać klasę SqlBulkCopy, która jest znacznie lepszym rozwiązaniem niż użycie klasycznego SqlCommand z poleceniem INSERT. Załóżmy, że chcemy przekopiować dane z tabeli o nazwie “Adresy” do tabeli “Adresy_Archiwum”:

using (SqlConnection sourceConnection =
         new SqlConnection(connectionString))
{
  sourceConnection.Open();
    
  SqlCommand commandSourceData = new SqlCommand(
      "SELECT * FROM Adresy", sourceConnection);
  SqlDataReader reader =
      commandSourceData.ExecuteReader();
  
  using (SqlConnection destinationConnection =
             new SqlConnection(connectionString))
  {
      destinationConnection.Open();
  
      using (SqlBulkCopy bulkCopy =
                 new SqlBulkCopy(destinationConnection))
      {
          bulkCopy.DestinationTableName =
              "dbo.Adresy_Archiwum";
          
         bulkCopy.WriteToServer(reader);
        
      }
  }
}

Jak widać należy stworzyć dwa osobne połączenia SqlConnection.

4 thoughts on “Kopiowanie dużej ilości danych z jednego źródła do drugiego”

  1. A po co w ogóle przerzucać coś takiego przez aplikację? Nie lepiej całe zadanie wykonać bezpośrednio w bazie, np tak:

    INSERT INTO `Adresy_Archiwum` SELECT * FROM `Adresy`

    ?

  2. Nie bedzie. SqlBulkCopy wykorzystuje narzedzie bcp do wstawiania wierszy. Ponadto mozna kopiowac dane pomiedzy rozne serwery.
    Z kolei nie wiem szczerze jak wyglada z wydajnoscia dla malej ilosci wierszy (powiedzmy 10). Za to dla ogromnych tabel (np. kilka milionow) zdecydowanie SqlBulkCopy i wszystko co ma w nazwie bulk…:)

Leave a Reply

Your email address will not be published.