2016-11-04 3 views
1

Мне нужно увеличить счетчик и обновить строки в моей таблице db, но по какой-то причине он не увеличивается. Может ли кто-нибудь увидеть, что не так с этим T-SQL?Счетчик переменных T-SQL, не увеличивающий

DECLARE @id INT 
DECLARE @name NVARCHAR(100) 
DECLARE @getid CURSOR 
declare @counter int 
    set @counter = 0 
SET @getid = CURSOR FOR 
SELECT ShipmentTrackingNumber, 
     Courier 
FROM Shipping WHERE (ShipmentTrackingNumber = '') 
OPEN @getid 
FETCH NEXT 
FROM @getid INTO @id, @name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE SHipping SET ShipmentTrackingNumber = 'STN00000' + cast(@counter as VARCHAR(16)) 
    set @counter = @counter + 1 
    FETCH NEXT 
    FROM @getid INTO @id, @name 
END 
CLOSE @getid 
DEALLOCATE @getid 
+2

Вы можете сделать это с помощью row_number как одного оператора обновления вместо цикла. Не говоря уже о том, что ваш оператор обновления в настоящее время обновляет всю таблицу каждой итерацией по циклу. Я сомневаюсь, что это то, что вы хотите. –

+0

Никогда не переходите к полному rbar ... – Charleh

ответ

10

Ваша проблема заключается в том, что не @counter не приращением. Ваша проблема в том, что update обновляет все строки строк на каждой итерации. Не существует where, поэтому каждая строка заканчивается тем же значением.

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

То, что вы действительно хотите, это гораздо проще вариант:

with toupdate as (
     select s.*, row_number() over (order by (select null)) as seqnum 
     from shipping s 
     where ShipmentTrackingNumber = '' 
    ) 
update toupdate 
    set ShipmentTrackingNumber = 'STN00000' + cast(seqnum as varchar(16)); 
0

Как вы не mantioned так, я предполагаю, что Ваш первичный ключ поле ID.

Следующий запрос получит последний номер ShipmentTrackingNumber, чтобы мы могли продолжить процесс инкремента после этого числа.

DECLARE @Last_ID INT; 
SELECT @Last_ID = MAX(T.STN) FROM (SELECT RIGHT(ShipmentTrackingNumber,LEN(ShipmentTrackingNumber) - 3) AS STN 
         FROM SHipping WHERE ShipmentTrackingNumber <> '') T 

я после этого, мы выполняем оператор обновления, чтобы обновить ShipmentTrackingNumber поле

Update SH 
SET ShipmentTrackingNumber = 'STN' + RIGHT('00000' + CAST(SH1.ROW_ID AS VARCHAR(6)) ,6) 
FROM SHipping SH INNER JOIN (SELECT (ROW_NUMBER() OVER(ORDER BY ID) + @Last_ID) AS ROW_ID,ID 
           FROM SHipping SH1 
           WHERE ISNULL(SH1.ShipmentTrackingNumber,'') = '' 
          ) SH1 ON SH1.ID=SH.ID 

Здесь я использовать ROW_NUMBER, чтобы получить серийный номер в accending порядка и добавил последний ShipmentTrackingNumber номер в нем , Таким образом, мы можем получить следующий номер отслеживания.

Есть еще одна вещь, которую я заметил, что ваш ShipmentTrackingNumber имеет некоторый префикс, как 5 раз ноль перед номером (то есть STN000001). Поэтому я предлагаю вам исправить количество цифр в вашем идентификационном номере, если значения увеличились в несколько цифр (то есть STN000011, STN005210, STN325210), удалив ненужные нули, используя функцию Right().

Это поможет вам получить правильный порядок сортировки.

Смежные вопросы