sql-server - 在 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
解决方案
正如评论中提到的,使用 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 批次。)
推荐阅读
- r - Tidycensus 包:你能用人口普查块获得经纬度吗?
- docker - 无法构建 docker 容器
- java - 如何在 Micronaut 中使用 @Parameter?
- twitter - MVC 5 不能让 Twitter Auth 工作了
- javascript - 在数字前加上 + 或 -
- autohotkey - 了解为什么我的 AutoHotkey 变量没有被分配
- reactjs - 如何安全地传递参数以使用 react-rails 反应组件
- composer-php - 如何创建使用本地 Bitbucket 服务器作为 Composer 包源的 Artifactory 远程存储库
- linux - 错误 503,HAProxy 问题跨其他代理、Docker 和 LXD 转换服务
- r - 如果方阵是对称的。逆也应该是对称的吗?