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