проверить существующую запись перед вставкой - PullRequest
2 голосов
/ 16 февраля 2011

Я хочу вставить несколько записей (~ 1000), используя C # и SQL Server 2000 в качестве базы данных, но перед тем, как вставить, как я могу проверить, существует ли запись, которую я вставляю, уже существует, и если да, должна быть вставлена ​​следующая запись. Записи поступают из структурированного файла Excel, затем я загружаю их в общую коллекцию, перебираю каждый элемент и выполняю вставку, подобную этой

// Insert records into database
private void insertRecords() {

  try {
    // iterate through all records 
    // and perform insert on each iteration
    for (int i = 0; i < names.Count; i++) {
      sCommand.Parameters.AddWithValue("@name", Names[i]);
      sCommand.Parameters.AddWithValue("@person", ContactPeople[i]);
      sCommand.Parameters.AddWithValue("@number", Phones[i]);
      sCommand.Parameters.AddWithValue("@address", Addresses[i]); 

      // Open the connection
      sConnection.Open();
      sCommand.ExecuteNonQuery();
      sConnection.Close();

    }
  } catch (SqlException ex) {
    throw ex;
  }
}

Этот код использует хранимую процедуру для вставки записей, но я могу проверить запись перед вставкой?

Ответы [ 4 ]

4 голосов
/ 16 февраля 2011

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

IF EXISTS(SELECT * FROM dbo.YourTable WHERE Name = @Name)
     RETURN

-- here, after the check, do the INSERT

Возможно, вы также захотите создать УНИКАЛЬНЫЙ ИНДЕКСВаш столбец Name, чтобы убедиться, что не существует двух строк с одинаковым значением:

CREATE UNIQUE NONCLUSTERED INDEX UIX_Name
   ON dbo.YourTable(Name)
0 голосов
/ 16 февраля 2011

Самый простой способ, вероятно, заключался бы в наличии внутреннего цикла try внутри вашего цикла. Перехватывайте любые ошибки БД и перебрасывайте их, если они , а не ошибка дублирующейся записи Если это ошибка дублирующейся записи, ничего не предпринимайте (исключение).

0 голосов
/ 16 февраля 2011

В хранимой процедуре для строки, которая будет добавлена ​​в базу данных, сначала проверьте, присутствует ли строка в таблице.Если это присутствует, UPDATE это, иначе INSERT это.В SQL 2008 также есть команда MERGE, которая, по сути, объединяет обновление и вставку.

С точки зрения производительности RBAR (строка за агонизирующей строкой) довольно неэффективна.Если скорость является проблемой, вам нужно изучить различные процессы «вставка сразу нескольких строк»: BULK INSERT, утилита bcp и пакеты служб SSIS.У вас все еще есть или / или проблема, но по крайней мере она будет работать лучше.


Редактировать:

Массовая вставка данных в пустую таблицу легко.Массовая вставка новых данных в непустую таблицу очень проста.Массовая вставка данных в таблицу, где некоторые данные (как, по-видимому, определяется первичным ключом) уже присутствуют, является сложной задачей.Увы, конкретные шаги детализируются быстро и очень зависят от вашей системы, кода, структур данных и т. Д. И т. Д.

Основные шаги, которые необходимо выполнить: - создать временную таблицу - загрузить данные во временнуютаблица - Сравните содержимое временной таблицы с содержимым целевой таблицы - Там, где они совпадают (старые данные), ОБНОВЛЕНИЕ - Там, где они не совпадают (новые данные), INSERT

Я сделал быстрый поиск поТАК для других постов, которые освещали это и наткнулись на то, о чем я никогда не думал.Попробуйте это ;он не только будет работать, но и элегантен.

0 голосов
/ 16 февраля 2011

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

...