大量删除和插入

时间:2019-04-16 20:05:02

标签: sql sql-server sql-server-2005

我正在尝试创建一个脚本来检查一个寄存器是否存在,如果存在,它将删除它并插入一个包含更新数据的新寄存器。 我使用一个程序将脚本从一个NAS复制到另一个NAS,该脚本非常基本。

到目前为止,我的代码使用以下几行创建了一个脚本:

IF EXISTS (SELECT TOP 1 iDRegister FROM Documents WHERE iDRegister= 123456) BEGIN
    DELETE FROM Documents WHERE iDRegister= 123456
END
INSERT INTO Documents (iDRegister, idAPP, idDocType, Batch, BatchUploadDate, UploadDate, Route, idNas, Memo, NroMemo, DocID, ClientID, Folio, PolicyNum, CardNum, ProposalNum, RequirementNum, SolicitacionNum, AuditNum, RejectNum, SentMemo, OccurNum, StampDate, CompanyFund, IsMemo)
VALUES (123456, 10, 1, '1', CONVERT(VARCHAR(50), GETDATE(), 120), '20190416', 'Route\image.TIF', 1, '11111', '', '111111111', '', '11111111111111', '', '', '', '', '', '', '', '', '', '', '', 'NO')

这很好用,但是对于220万个寄存器,我必须这样做。有什么方法可以删除以前的寄存器(如果存在)然后使用批量插入?

1 个答案:

答案 0 :(得分:1)

您可以改为UPDATE吗?

UPDATE D
SET D.Field = D.NewValue
FROM Documents D
JOIN tableWithIDsToUpdate T ON D.iDRegister = T.iDRegister

您可能仍想分批更新,因此您一次不会做220万次。

修改

由于还需要INSERT行不存在的行进行更新,因此您可以按照上述步骤进行操作:

INSERT INTO Documents (col1, col2, etc)
SELECT col1, col2, etc
FROM tableWithIDsToUpdate T
LEFT JOIN Documents D ON D.iDRegister = T.idRegister
WHERE D.idRegister IS NULL