需要 T-SQL 游标的帮助,本质上是检索前一行 +1 的整数

Need assistance with T-SQL cursor, Essentially retrieving an integer that is +1 the previous row

我正在尝试创建一个固定位置文件,但 运行 遇到了麻烦。本质上,我需要创建一个基于自动编号的 ID。

我有一个变量告诉我上次使用的数字。例如:

DECLARE @lastNumUsed int = 1

在网上做了一些研究后,我想我可以用游标来完成这个。我不熟悉游标,所以请多多包涵。

我的最终目标是: 如果我有 3 个 payeeIDs EX: 101 110 165

我需要找到我使用的最后一个视频 (1) 并将 101 分配给 2、110 分配给 3、165 分配给 4。

现在我得到:

2 3个 3

请注意,vid 是 nvarchar,因为获取此数字只是创建所需内容的第一步。它最终将成为一个字母数字字段。

有人能给我指出正确的方向吗?

DECLARE @payeeID int;
DECLARE @vid as nvarchar(12);
DECLARE @VIDCursor as CURSOR;

SET @VIDCursor = CURSOR FOR
select 
    distinct @payeeID
    ,@VIDCursor
 from #tmpTable;

Open @VIDCursor;
FETCH NEXT FROM @VIDCursor INTO @payeeID, @vid;

WHILE @@Fetch_Status = 0
BEGIN

    Print @vid 

    FETCH NEXT FROM @VIDCursor INTO @payeeID, @vid 

    Set @vid  = @vid  + 1

END

Close @VIDCursor;
Deallocate @VIDCursor;

更新:我相信下面的回复更好,但如果有人觉得它有帮助,我确实让光标工作了,但我将更新我的代码以不使用光标并使用 row_number() 代替。

DECLARE @payeeID int;
DECLARE @vid int

Create TABLE #tmpTable
(
    payeeID int,
    vid int
)

DECLARE @VIDCursor as CURSOR;
SET @VIDCursor = CURSOR FOR 
select 
    distinct payeeID 
from #tmpItemizedDetails;

Open @VIDCursor;

FETCH NEXT FROM @VIDCursor INTO @payeeID;

WHILE @@Fetch_Status = 0
BEGIN
    Set @vid = @vid + 1

    Insert into #tmpVoucherNumbers values (@payeeID,@vid );

    FETCH NEXT FROM @VIDCursor INTO @payeeID 

END

Close @VIDCursor ;
Deallocate @VIDCursor ;

你也可以在没有游标的情况下执行此操作,例如:

DECLARE @lastNumUsed INT = 1
SELECT  payeeID, ISNULL(@lastNumUsed,0)+ROW_NUMBER() OVER (ORDER BY payeeID) AS vid
FROM    #tmpTable;

如果我理解正确的话,您想要的是按 payeeID 顺序编号的行,从最后使用的 +1 开始?

怎么样:

Declare @LastVidUsed int=1
SELECT payeeID
       , row_number() over (order by payeeID) + @LastVidUsed vid
FROM #TMP
GROUP BY payeeID

抱歉,您开始的游标解决方案是一团糟,无论如何我都不会那样做!