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

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

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

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 ;

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

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

DECLARE @lastNumUsed INT = 1
SELECT  payeeID, ISNULL(@lastNumUsed,0)+ROW_NUMBER() OVER (ORDER BY payeeID) AS vid
FROM    #tmpTable;
0 голосов
/ 15 апреля 2019

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

Как насчет:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...