【问题标题】:Generate 100 million records between 2 ranges and insert在 2 个范围之间生成 1 亿条记录并插入
【发布时间】:2021-02-08 19:43:52
【问题描述】:

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

【问题讨论】:

  • 您想要的称为 Tally。有很多关于如何创建这些的示例。
  • "SQL Server Tally 表" -> Google.com
  • 不要使用addwithvalue
  • 请参阅 here,了解可能是 Itzik Ben-Gan 的最佳示例
  • 从 itzik 到最近讨论的好链接 - 尤其是。如果需要 1 亿个值快速(尽管在最坏的情况下 30 秒仍然很短)。

标签: sql-server vb.net


【解决方案1】:

正如 cmets 中提到的,使用 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 批。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2011-02-20
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多