#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. Приятно! Мне нравится этот подход. Я не знаком с курсорами, но это был лучший ответ, который я получал через Интернет! Спасибо.