在 2 个范围之间生成 1 亿条记录并插入

时间:2021-02-08 19:43:52

标签: sql-server vb.net

我有一个请求,要为一个处理通话时间充值卡的仓库开发一个库存系统。根据要求,他们可以将序列号加载到数据库中,该数据库至少可以包含大约 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

1 个答案:

答案 0 :(得分:1)

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

简而言之,如果您需要定义开始值和结束值,那么除了 TOP 和一些基本添加之外,这几乎不需要更改。对于多达 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;

如果您需要更多行,只需在 CTE Tally 中向 N 添加更多交叉连接。 (尽管对于 100M,您最好进行 10M 批次。)

相关问题