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