В этом случае у меня есть таблица Plant_Component
, у которой есть столбец CODE
. Мы добавили в наш веб-приложение код для автоматического вычисления значения, которое поступит в Plant_Component.CODE
для новых вставленных записей, и теперь я должен выполнить некоторую очистку и вставить правильное значение в таблицу Plant_Component
с CODE = 'testcode'
.Обновление нескольких записей с различными инкрементальными значениями
Логика для вычисления кода является:
- Получить все значения из
Plant_Component.CODE
- Выберите только значения Wich являются целыми числами
- Из этих целочисленных значений, получить максимум
- Добавить 1 до максимального значения, и это мой код.
Запрос я использовал:
UPDATE Plant_Component
SET CODE = CONVERT(varchar, CONVERT(integer, PCread.CODE) + 1)
FROM
(SELECT CODE
FROM Plant_Component
WHERE ISNUMERIC(CODE) = 1
AND CODE NOT LIKE '%[^0-9]%'
) AS PCread
WHERE Plant_Component.CODE = 'testcode'
Проблема заключается в том же значение получает вставляется в каждой строке, пострадавших от этого запроса. Чтобы объяснить себя, когда я проверил это, мое максимальное целочисленное значение было 507007, и каждая затронутая строка была обновлена значением 507008 ...
Есть ли способ сделать это так, чтобы каждая другая затронутая строка увеличивала это значение на 1 ?
Пример: Если в данный момент я запускаю запрос мой максимальный код является 507007, и запрос затрагивает три записи, я думаю, эти три записи, чтобы иметь код соответственно 507008, 507009, 507010.
ПРИМЕЧАНИЕ: Я знаете, как я определяю значение как целое, не является надежным, но это одноразовый скрипт, и я знаю, что не будет никаких значений, которые заставят это получить ошибку (например, я думаю, значение «999999999999999999999999999999999999» 'может привести к аварии)
Вы пытались установить FROM Plant_Component и присоединиться к текущей части FROM, а затем выбрать PCread.CODE? Я полагаю, потому что у вас нет компонента Plant_Component, запрос предполагает обновить всю таблицу с первым значением, которое она находит. Однако не проверял. – martennis