首页 > 解决方案 > 在 2 个范围之间生成 1 亿条记录并插入

问题描述

我有一个请求为一个处理通话时间充值卡的仓库开发一个库存系统。根据要求,他们可以将序列号加载到数据库中,该数据库至少可以包含大约 1 亿条单独的记录。我需要一个可以接受两个字符串的函数,并使用它来生成该范围内的各个记录,如下所示。但我知道这不是生成和插入数据库的有效方法,请帮助

startserial : 99092110000000
endserial   : 99092119999999

代码:

Private Sub Scanin(startserial As String, Endserial As String)
    Dim serialnum As Decimal : Dim qry As String

    serialnum = CDec(startserial)

    For inc As Decimal = serialnum To CDec(Endserial)
        qry = "Insert into BatchTemp(SerialNumber) VALUES (@a)"
        cmd = New SqlCommand(qry, con)
        cmd.Parameters.AddWithValue("@a", serialnum)

        cmd.ExecuteNonQuery()

        serialnum += 1
    Next
End Sub

标签: sql-servervb.net

解决方案


正如评论中提到的,使用 Tally。不要使用 rCTE 来执行此操作,它们非常慢(正如我在这里展示的那样),请使用基于集合的方法和ROW_NUMBER. @CharlieFace 还在 Itzik Ben-Gan的文章中为您提供了如何在他们的评论中创建计数的链接。

简而言之,如果您需要定义起始值和结束值,那么除了 aTOP和一些基本添加之外,这几乎不需要更改。对于多达 10,000 行的计数,我会这样写:

DECLARE @Start int = 700,
        @End int = 9874;

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@End - @Start +1)
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + @Start - 1 AS I
    FROM N N1, N N2, N N3, N N4) --10,000 rows
SELECT I
FROM Tally;

如果您需要更多行,则只需N在 CTE Tally 中添加更多交叉连接。(虽然对于 100M,你最好做 10M 批次。)


推荐阅读