Удаление данных из вставленной строки

#sql-server #bulkinsert

#sql-сервер #bulkinsert

Вопрос:

Я вставлял массовые данные из Excel в SQL, используя пакет bulk insert, который я создал. При последовательной вставке данных я пропустил файл, который нужно было вставить, поэтому я остановил пакет посередине. Однако пакет уже добавил около 2500 строк, я удалил эти строки, используя «удалить top (2500) из coulmn_name» и продолжил вставку данных. Теперь я боюсь, действительно ли я удалил последние добавленные записи или какие-то случайные данные. Может ли кто-нибудь помочь мне понять это?

Комментарии:

1. Нет, TOP без ORDER BY не гарантирует, что он удалит последние 2500 строк.

Ответ №1:

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

Чтобы показать, что TOP не заботится о «последнем»:

 CREATE TABLE #foo(id int IDENTITY(1,1) PRIMARY KEY, name sysname);
INSERT #foo(name) VALUES('Bob');
INSERT #foo(name) VALUES('Frank');
INSERT #foo(name) VALUES('Aaron');
INSERT #foo(name) VALUES('William');
INSERT #foo(name) VALUES('Mary');

DELETE TOP (2) FROM #foo;

SELECT * FROM #foo;

DROP TABLE #foo;
  

Результаты:

 id  name
--  -------
3   Aaron
4   William
5   Mary
  

Это удалило первые два, которые были вставлены (и им просто были последовательно присвоены целочисленные значения). Теперь попробуйте это:

 CREATE TABLE #foo(id int PRIMARY KEY, name sysname);
INSERT #foo(id,name) VALUES(3,'Bob');
INSERT #foo(id,name) VALUES(12,'Frank');
INSERT #foo(id,name) VALUES(84,'Aaron');
INSERT #foo(id,name) VALUES(16,'William');
INSERT #foo(id,name) VALUES(7,'Mary');

DELETE TOP (2) FROM #foo;

SELECT * FROM #foo;

DROP TABLE #foo;
  

Результаты:

 id  name
--  -------
12  Frank
16  William
84  Aaron
  

Были удалены разные строки. Теперь измените значение CREATE на:

 CREATE TABLE #foo(id int, name sysname UNIQUE);
  

Те же результаты insert delete:

 id  name
--  -------
84  Aaron
16  William
7   Mary
  

Таблица не упорядочена. TOP без ORDER BY (фактически любой запрос без ORDER BY) следует считать произвольным (возможно, полезно даже думать об этом как о случайном).

Комментарии:

1. Есть ли способ узнать, какие строки я удалил? Потому что это огромные данные.

2. Они все еще могут быть в журнале, но это зависит от модели восстановления, частоты резервных копий и т. Д. Смотрите Этот пост на DBA.se и этот пост в блоге .

Ответ №2:

Вы удалили случайные данные, поскольку строки возвращаются в порядке чтения. Например, если вы запустите одну и ту же инструкцию «выбрать топ-5» 5-10 раз, то нет никаких гарантий, что вы получите один и тот же набор данных, потому что некоторые страницы или строки могут быть заблокированы.