Любой способ проверить, существуют ли данные в базе данных во время массового копирования SQL - PullRequest
1 голос
/ 12 марта 2020

Я копирую некоторые данные из одной SQL базы данных сервера в другую SQL базу данных сервера.

Это прекрасно работает, мне нужно проверить, если какие-то данные уже существуют, а не копировать их. Как я могу это сделать? Какие-либо предложения?

string Source = ConfigurationManager.ConnectionStrings["Db1"].ConnectionString;
string Destination = ConfigurationManager.ConnectionStrings["Db2"].ConnectionString;

using (SqlConnection sourceCon = new SqlConnection(Source))
{
    SqlCommand cmd = new SqlCommand("SELECT [Id],[Client] FROM [Db1].[dbo].[Client]", sourceCon);
    sourceCon.Open();

    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        using (SqlConnection destCon = new SqlConnection(Destination))
        {
            using (SqlBulkCopy bc = new SqlBulkCopy(destCon))
            {
                    bc.DestinationTableName = "Clients";
                    bc.ColumnMappings.Add("Id", "ClientId");
                    bc.ColumnMappings.Add("Client", "Client");
                    destCon.Open();

                    bc.WriteToServer(rdr);
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Один из способов сделать то, что вам нужно, - это массовое копирование в промежуточную таблицу (отдельная таблица с похожим форматом), а затем выполнить условную вставку из промежуточной таблицы в реальную table.

Вы также можете сделать что-то подобное, используя параметр table-valueed вместо SqlBulkCopy, и обработать параметр table-valueed как промежуточную таблицу.

0 голосов
/ 12 марта 2020

Скопируйте все таблицы из исходной базы данных в целевую базу данных в качестве временных таблиц, затем запустите SQL, чтобы добавить отсутствующую запись из временной таблицы в целевую таблицу. Последний шаг для удаления временных таблиц.

надеюсь, что это сработает для вас.

0 голосов
/ 12 марта 2020

Вы можете сделать ссылку на базу данных из исходной базы данных в место назначения и выполнить запрос, чтобы определить, какие строки нужно будет передать, но будьте осторожны, чтобы не перетаскивать слишком много данных по ссылке, поскольку это может замедлить процесс - реалистично вам нужно только. Столбцы, которые вы будете использовать, чтобы определить, равна ли строка в источнике строке в dest

Обычно, хотя проще скопировать все данные во временную таблицу в месте назначения, а затем использовать слияние или вставку в левое соединение для вставить только некоторые данные из временной таблицы в реальную таблицу

Вот пример того, как вставить только некоторые строки, которые еще не существуют:

INSERT INTO real(column1,column2...)
SELECT temp.column1,temp.column2... FROM
  temp 
  LEFT JOIN real ON real.ID = temp.ID
WHERE 
  real.ID IS NULL

В терминах c# это будет выглядеть как:

  new SqlCommand(@"INSERT INTO real(column1,column2...)
SELECT temp.column1,temp.column2... FROM
  temp 
  LEFT JOIN real ON real.ID = temp.ID
WHERE 
  real.ID IS NULL", conn).ExecuteNonQuery();

Вам нужно запустить это, используя conn, подключенный к вашей целевой базе данных

...