从插入的行中删除数据

时间:2019-04-10 13:03:18

标签: sql-server bulkinsert

我正在使用创建的批量插入包将Excel中的批量数据插入SQL。在顺序插入数据时,我错过了必须插入的文件,因此我在中间停了包。 但是,该软件包已经添加了2500行,我使用“从coulmn_name中删除top(2500)”删除了这些行,然后继续插入数据。 现在,我担心是否实际上删除了最后添加的记录或一些随机数据。 谁能帮助我理解这一点?

2 个答案:

答案 0 :(得分:1)

您将需要其他方式来标识要删除的行,例如具有BatchID或其他名称。人们通常为此使用登台表,以免大批量操作不会干扰正常使用,而且当事情往南走时,您可以截断并重新开始。

要表明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

该操作删除了插入的 first 前两个(并且恰好被顺序分配了整数值)。现在尝试这个:

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);

相同的插入+删除产量:

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

未订购表。不带ORDER BY的TOP(实际上,任何不带ORDER BY的查询)都应该被认为是任意的(也许甚至认为它是随机的也是有帮助的)。

答案 1 :(得分:0)

您已删除随机数据,因为行按读取顺序返回。例如,如果您运行相同的“ select top 5”语句5-10次,则不能保证在那里会得到相同的数据集,因为某些页面或字符串可能会被阻止。