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

时间:2019-04-15 17:22:39

标签: tsql database-cursor

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

我有一个变量,可以告诉我最后使用的数字。例如:

DECLARE @lastNumUsed int = 1

在进行了一些在线研究之后,我认为我可以使用游标完成此操作。我不熟悉游标,所以请多多包涵。

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

我需要找到我使用的最后一个(1)vid,并将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()。 / p>

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 ;

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果我正确理解了您想要的是按payeeID顺序进行的行编号,则从上次使用的+1开始?

怎么样:

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

很抱歉,您启动的光标解决方案是一团糟,无论如何我不会那样做!