Я хочу обновить свой столбец CODE_DEST с инкрементным числом. У меня есть:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Я хотел бы обновить его, чтобы он был:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Я пробовал этот код:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Это не работает из-за )
Я также пробовал:
WITH DESTINATAIRE_TEMP AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
Но это тоже не работает из-за союза.
Как я могу обновить столбец с помощью ROW_NUMBER()
функции в SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
user609511
источник
источник
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Ответы:
Еще один вариант
источник
попробуй это
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
источник
SET CODE_DEST = @id, @id = @id + 1
для удобочитаемости.источник
Вторая попытка не удалась в первую очередь потому, что вы назвали CTE таким же, как и основная таблица, и сделали CTE похожим на рекурсивный CTE , потому что он, по сути, ссылался на себя. Рекурсивные ОТВА должны иметь определенную структуру , которая требует использования
UNION ALL
множества оператора.Вместо этого вы могли бы просто дать CTE другое имя, а также добавить к нему целевой столбец:
источник
Это модифицированная версия ответа @Aleksandr Fedorenko с добавлением предложения WHERE:
Добавив предложение WHERE, я обнаружил, что производительность значительно улучшилась для последующих обновлений. Кажется, что Sql Server обновляет строку, даже если значение уже существует, и для этого требуется время, поэтому добавление предложения where заставляет его просто пропускать строки, где значение не изменилось. Должен сказать, я был поражен тем, насколько быстро он мог выполнить мой запрос.
Отказ от ответственности: я не эксперт по БД, и я использую PARTITION BY для своего предложения, поэтому для этого запроса могут быть не совсем те же результаты. Для меня рассматриваемый столбец является оплаченным заказом клиента, поэтому значение обычно не меняется после его установки.
Также убедитесь, что у вас есть индексы, особенно если у вас есть предложение WHERE в инструкции SELECT. У меня отлично сработал отфильтрованный индекс, поскольку я выполнял фильтрацию по статусам платежей.
Мой запрос с использованием PARTITION по
Часть IS NOT NULL не требуется, если столбец не допускает значения NULL.
Когда я говорю, что прирост производительности был огромным, я имел в виду, что он был практически мгновенным при обновлении небольшого количества строк. С правильными индексами я смог добиться обновления, которое заняло то же время, что и «внутренний» запрос сам по себе:
источник
Я сделал это для своей ситуации и работал
источник
Простой и легкий способ обновить курсор
источник
Если таблица не имеет отношения, просто скопируйте все в новую таблицу с номером строки, удалите старую и переименуйте новую на старую.
источник