我正在尝试创建一个固定位置文件,并且遇到了麻烦。本质上,我需要创建一个基于自动编号的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 ;
答案 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
很抱歉,您启动的光标解决方案是一团糟,无论如何我不会那样做!