如何将序列号连接到不相关的数据(SQL Server)

enr*_*ein 2 t-sql sql-server sql-server-2005 sequential-number

这个问题是我之前关于发现未使用的序列号范围的问题的后续问题,而不必使用游标(在没有游标的情况下使用SQL Server 2005中的序列号).我正在使用SQL Server 2005.

我需要对这些数字做的是将这些数字分配给表格中的记录.我似乎无法想出一种方法来实际将数字表与需要这些数字的记录联系起来.

我想到的一个可能的解决方案是使用标识将记录插入临时表中,并使用数字范围的开头作为标识种子.这种方法的唯一问题是,如果数字序列中存在间隙,那么我将最终得到重复的控制数.

这就是我的表格的样子(过于简化):

数字表:

Number      
-------
102314
102315
102319
102320
102324
102329 
Run Code Online (Sandbox Code Playgroud)

数据表:

CustomerId   PaymentAmt   ControlNumber
----------   ----------   -------------
1001         4502.01      NULL
1002         890.00       NULL
9830         902923.34    NULL
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来实现它,所以我最终得到:

CustomerId   PaymentAmt   ControlNumber
----------   ----------   -------------
1001         4502.01      102314
1002         890.00       102315
9830         902923.34    102319
Run Code Online (Sandbox Code Playgroud)

这是否可以在不使用游标的情况下实现?我之所以避免使用游标是因为我们当前的实现使用了游标,因为它很慢(超过12,000条记录的8分钟),我一直在寻找替代方案.

注意:感谢所有发布答案的人.所有这些都很棒,我不得不选择一个看起来更容易实现并且最容易维护的人.非常感激.

Lam*_*mak 6

试试这个:

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY CustomerId) Corr
    FROM DataTable
)

UPDATE CTE
SET CTE.ControlNumber = B.Number
FROM CTE
JOIN (  SELECT Number, ROW_NUMBER() OVER(ORDER BY Number) Corr
        FROM NumberTable) B
ON CTE.Corr = B.Corr
Run Code Online (Sandbox Code Playgroud)