1

我目前正在开展一个项目,该项目需要一个将“控制编号”分配给某些记录的流程。这还需要能够在以后运行并包括未更改控制编号的记录,并将未使用的控制编号分配给这些记录。这些控制号码由外部实体预先分配,长度为 9 位。您通常会获得一个范围,具体取决于您的公司将生成多少估计记录。例如,其中一家公司估计他们需要 50 个,因此他们为我们分配了 790123401 到 790123450 的范围。

问题:现在我正在使用游标来分配这些数字。对于每个单独的记录,我会检查序列中的第一个数字是否已经在表中,如果是,我增加数字并重新检查。对于表中的每条记录,这种检查都会持续进行。其中一家公司有 17,000 条记录,这意味着对于每条记录,如果已获取所有数字,我可能在最坏的情况下迭代 17,000 次。

我真的不介意初次运行时的所有重复,因为第一次运行会将控制编号分配给很多记录。我的问题是,如果稍后记录被更改并且现在应该有一个与之关联的控制编号,那么重新运行该过程将意味着它将遍历每个可用的编号,直到我得到一个未使用的编号。

我看过很多关于如何使用没有游标的序列的示例,但大多数都是特定于 Oracle 的。我正在为这个特定项目使用 SQL Server 2005。

建议?

4

1 回答 1

3

您正在寻找一个范围内所有未分配的数字?如果是这样,您可以外部加入数字表。下面的示例使用 CTE 即时创建一个,如果这是您范围的最大大小,我建议使用一个包含至少 17,000 个数字的永久数字。

DECLARE @StartRange int, @EndRange int
SET @StartRange = 790123401
SET @EndRange = 790123450;

WITH YourTable(ControlNumber) AS
(
SELECT 790123401 UNION ALL
SELECT 790123402 UNION ALL
SELECT 790123403 UNION ALL
SELECT 790123406
),
Nums(N) AS
(
SELECT @StartRange
UNION ALL
SELECT N+1
FROM Nums
WHERE N < @EndRange
)
SELECT N 
FROM Nums
WHERE NOT EXISTS(SELECT * 
                 FROM YourTable 
                 WHERE ControlNumber = N )
OPTION (MAXRECURSION 0)          
于 2011-03-16T21:18:20.930 回答