#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 раз, то нет никаких гарантий, что вы получите один и тот же набор данных, потому что некоторые страницы или строки могут быть заблокированы.