Нужна помощь с курсором T-SQL, по существу, для получения целого числа, равного 1 предыдущей строке

#tsql #database-cursor

#tsql #база данных-курсор

Вопрос:

Я пытаюсь создать файл с фиксированной позицией и сталкиваюсь с проблемой. По сути, мне нужно создать идентификатор, основанный на автоматическом номере.

У меня есть переменная, которая сообщает мне последнее используемое число. Так, например:

 DECLARE @lastNumUsed int = 1
 

Проведя некоторое исследование в Интернете, я думаю, что смогу выполнить это с помощью курсора. Я не знаком с курсорами, так что потерпите меня.

Моя конечная цель такова: если у меня есть 3 идентификатора получателя платежа, НАПРИМЕР: 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 ;
 

Ответ №1:

Вы также можете сделать это без курсоров, например:

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

Ответ №2:

Если я правильно понимаю, вам нужна нумерация строк в порядке payeeID, начиная с последнего используемого 1?

Как насчет:

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

Решение для курсора, которое вы начали, к сожалению, беспорядок, я бы так не поступил!

Комментарии:

1. Приятно! Мне нравится этот подход. Я не знаком с курсорами, но это был лучший ответ, который я получал через Интернет! Спасибо.