使用 SQL Server 2008
我正在研究一种将多张发票合并为一张发票的方法。如果我不提供发票 ID,而是提供与多张发票相关联的批次 ID,我可以利用我们现有的索赔调整存储过程。
这个问题的细节允许一些自动化:要分组的发票在它们的表中总是相邻的,并且组大小在每组批次中是恒定的。
我的问题:T-SQL 是否提供了一种基于集合(即不是循环)的方法来自动增加每 N 条记录的“ID”列?
我知道基于非集合的方法是使用带有计数器的游标,该计数器每次 ID % N 等于 0 时都会递增。请参阅以下示例,了解每两条记录递增的字段:
CREATE TABLE #BatchInvnums (id INT PRIMARY KEY IDENTITY, invnum INT, batchID INT)
INSERT INTO #BatchInvnums (invnum)
VALUES (178),(543),(724),(809),(164),(276)
DECLARE @CurrentID INT, @CurrentInvnum INT, @Counter INT = 0
DECLARE CurBatchIDSetter CURSOR FORWARD_ONLY FOR
SELECT ID, invnum
FROM #BatchInvnums
ORDER BY ID
OPEN CurBatchIDSetter
FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #BatchInvnums
SET batchID = @Counter
WHERE invnum = @CurrentInvnum
IF @CurrentID % 2 = 0
BEGIN
SET @Counter = @Counter + 1
END
FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum
END
CLOSE CurBatchIDSetter
DEALLOCATE CurBatchIDSetter
同样,以上是我宁愿不做的。我想使用单个更新语句,或者更好的是,在创建表时应用一些属性来实现这种效果。有任何想法吗?