IF-ELSE внутри SQL Cursor для изменения значений записей - PullRequest
0 голосов
/ 28 марта 2019

У меня есть таблица SQL Server, в которой есть записи с одним полем, представляющим собой число, которое мне нужно перенумеровать в новую таблицу. Кроме того, в нем есть столбец идентификаторов, который будет повторяться в записях при многократном использовании. Я хотел бы отсортировать таблицу по полю идентичности, затем спуститься по полю номера, затем с помощью курсора пронумеровать первую запись (1), следующую запись (2) и т. Д., Пока поле идентичности не изменится, а затем повторить.

У меня есть следующие поля: load_number (identity), stop_type, stop_number Данные будут выглядеть так:

load_number - stop_type - stop_number
1234 ------------------ 1 ------------------- 1
1234 ------------------ 2 ------------------- 5
1234 ------------------ 2 ------------------- 4
1234 ------------------ 2 ------------------- 3
1234 ------------------ 2 ------------------- 2
1234 ------------------ 2 ------------------- 1

У меня есть другие поля, которые описывают каждую строку более подробно, но мне нужно, чтобы вышеупомянутые 5 стали 1, 4 стали 2, 3 остались 3, 2 стали 4 и 1 стали 5 (так что переверните числа полностью ) эти цифры могут доходить до 10.

DECLARE @lead_key int = 1, @load_number int, @stop_type, @stop_number, @stopnum

CREATE TABLE #renumber
    (load_number int, stop_type int, stop_number int)

DECLARE stop_cursor CURSOR FAST_FORWARD FOR
  select load_number, stop_type, stop_number 
  from sometable 
  order by load_number, stop_type, stop_number desc

OPEN stop_cursor

FETCH NEXT from stop_cursor
INTO @load_number, @stop_type, @stop_number

while @@FETCH_STATUS = 0
BEGIN

If @load_key = 1
  BEGIN
  SET @load_key = @load_number  --initialize @load_key for first record
  END

If @load_key = @load_number
  BEGIN
  If @stop_type = 2
    BEGIN
    insert into #renumber
    select @load_number, @stop_type, @stopnum  --use @stopnum counter
    SET @stopnum = @stopnum + 1
    END
  ELSE
    BEGIN
    insert into #renumber
    select @load_number, @stop_type, @stop_number   --use @stop_number
    SET @stopnum = 1    --reset @stopnum to 1
    END
  END
ELSE
  SET @load_key = @load_number
  SET @stopnum = 1
END

FETCH NEXT from stop_cursor
INTO @load_number, @stop_type, @stop_number

CLOSE stop_cursor;
DEALLOCATE stop_cursor;

Этот запрос зацикливается и никогда не заканчивается, моя способность к отладке не работает на моем ПК, поэтому я не могу пройти через это, чтобы увидеть, где он зацикливается, поэтому я решил спросить здесь, как мне получить то, что я есть находясь в поиске. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 28 марта 2019

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

Шаг 1:

CREATE TABLE #renumber
    (ID int identity(1,1), load_number int, stop_type int, stop_number int)

Шаг 2: Вставить таблицу с автоматически созданным идентификатором

insert into #renumber(load_number, stop_type, stop_number)
select load_number, stop_type, stop_number 
from sometable 
order by load_number, stop_type, stop_number desc

Шаг 3:

DECLARE @id int, @load_number int, @stop_type, @stop_number, @stopnum int

--Static cursor

DECLARE stop_cursor CURSOR STATIC FOR
  select id, load_number, stop_type, stop_number 
  from #renumber
  order by id

OPEN stop_cursor

FETCH NEXT from stop_cursor INTO @id, @load_number, @stop_type, @stop_number

while @@FETCH_STATUS = 0
BEGIN

If @load_key = 1
  BEGIN
  SET @load_key = @load_number  --initialize @load_key for first record
  END

If @load_key = @load_number
  BEGIN
  If @stop_type = 2
    BEGIN
    --Update the value you'd like base on ID
    update #renumber set stopnum = @stopnum where id = @id
    SET @stopnum = @stopnum + 1
    END
  ELSE
    BEGIN
    --Update the value you'd like base on ID
    update #renumber set stopnum = @stopnum where id = @id 
    SET @stopnum = 1    --reset @stopnum to 1
    END
  END
ELSE
  SET @load_key = @load_number
  SET @stopnum = 1
END

FETCH NEXT from stop_cursor INTO @id, @load_number, @stop_type, @stop_number

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