【问题标题】:Massive delete and insert大量删除和插入
【发布时间】:2019-09-07 00:14:23
【问题描述】:

我正在尝试创建一个脚本来检查一个寄存器是否存在,如果存在,它会删除它并插入一个带有更新数据的新寄存器。 我使用将文件从一个 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 万个寄存器做同样的事情。有什么办法可以删除以前的寄存器,如果它存在,然后使用批量插入?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 由于我正在做的项目的性质,我真的没有时间一次小批量地更新它们。此外,并非所有寄存器都存在,这就是为什么要使其通用我提出条件,如果存在,我删除它,否则我只是插入它
    • @Throkar 为什么?无论如何,您实际上是在更新记录。您正在删除它并插入一个新的。这不仅在更改记录方面效率极低,而且会极大地增加您的 SQL 日志。
    • 因为我在程序上自动生成我的脚本,所以我无法真正过滤那些已经注册的人。
    • 还有 OT,但有两件事与我有关。首先,SQL 2005 是古老的。忽略 SQL Server 之后的 4 个版本即将达到 EOL 的事实,您会看到升级到更现代版本的一些显着性能改进。其次,我看到一列 IsMemo 正在插入一个字符串。这似乎应该是一个布尔值,这也将提高您的性能(和存储要求)。
    • 我知道 SQL 2005 已经很老了,遗憾的是,我真的不能更新它。至于IsMemo这个栏目,在我收到项目的时候已经定义好了。
    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2010-11-25
    • 1970-01-01
    • 2011-04-30
    • 2010-11-21
    相关资源
    最近更新 更多