Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
leonix Member Откуда: Сообщений: 408 |
Нужно просто в колонке выставить 1, 2, 3, .... Пока вижу только решение с курсором |
13 май 19, 11:27 [21883148] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
leonix, перенумеровать - это сделать апдейт в таблице? |
13 май 19, 11:29 [21883150] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
leonix, или же - перенумеровать лишь результат выборки? |
13 май 19, 11:29 [21883151] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
да |
||
13 май 19, 11:29 [21883152] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Перенумеровать колонку в таблице которая храниться в базе. |
||
13 май 19, 11:30 [21883154] Ответить | Цитировать Сообщить модератору |
Sergey Syrovatchenko Member Откуда: Сообщений: 169 |
Добавляете новую колонку задаете для нее IDENTITY. Удаляете старую колонку (если критично), переименовываете новую на старую. Если с таблицей работают активно, то есть другие варианты. |
13 май 19, 11:31 [21883155] Ответить | Цитировать Сообщить модератору |
лолл Member Откуда: Сообщений: 450 |
Как вариант:USE tempdb; GO BEGIN TRAN CREATE TABLE test ( Id Int NULL ) INSERT test VALUES (NULL), (NULL), (NULL) CREATE SEQUENCE TestSeq AS Int START WITH 1 INCREMENT BY 1 ALTER TABLE test ADD CONSTRAINT DF_test_Id DEFAULT (NEXT VALUE FOR TestSeq) FOR Id UPDATE test SET Id = DEFAULT SELECT * FROM test ROLLBACK |
13 май 19, 12:05 [21883201] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Всем спасибо. Пойду пробовать на копии. Не знаю как 1С отреагирует на лишние колонки. |
13 май 19, 12:26 [21883232] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
WITH T AS (SELECT N=ROW_NUMBER()OVER(ORDER BY OrderField),* FROM TableName) UPDATE T SET NumberField=N;70 миллионов - не так уж и много. Ну подождёте какое-то время один раз... Не вижу в этом трагедии. |
13 май 19, 12:45 [21883255] Ответить | Цитировать Сообщить модератору |
zzzzzzzzzz Member Откуда: Сообщений: 356 |
http://www.dbdelta.com/add-or-remove-identity-property-from-an-existing-column-efficiently/ |
13 май 19, 16:46 [21883564] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Отчитываюсь. Колонку не удалось добавить. Система ругается что колонки нельзя создавать. Запрос WITH T AS (SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* FROM [dbo].[_InfoRg222]) UPDATE T SET _fld224=N; не удалось выполнить. После 10 часов работы вывалилась ошибка. "The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'." Похоже не хватила места на диске. Можно ли этот запрос выполнять порциями? |
14 май 19, 09:03 [21884040] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Раз такое дело, оформляйте вопрос как положено (напишите здесь CREATE TABLE, создание связанных с таблицей объектов - индексов, триггеров, констрейнтов, сообщите версию сервера и т.д.). Частями можно, но надо обеспечить, чтобы каждая следующая часть не содержала уже обработанные записи. |
||
14 май 19, 10:06 [21884088] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
leonix, А давайте зададимся более базовым вопросом, а зачем такая нумерация? И если вы хотите переименовать, то вам сложно сделать следующее? 1) Добавить новую колонку INT NULL 2) Порционно обновлять по TOP = 100000 за раз |
14 май 19, 15:38 [21884555] Ответить | Цитировать Сообщить модератору |
Danion Member Откуда: Москва Сообщений: 242 |
Подобное сообщение появляется при нехватке места лог файла базы tempdb. Так что да - либо закончилось место на диске, либо ограничен прирост файла и место в файле закончилось. Нужно либо разбивать на части, либо увеличивать диск\убирать ограничение автопроста. |
||
14 май 19, 16:30 [21884595] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Всем спасибо. Переосмыслил немного задачу. Переделал по другому. WITH T AS ( SELECT N=ROW_NUMBER() OVER(partition BY _fld223 ORDER BY _fld251),* FROM [dbo].[_InfoRg222] where SUBSTRING(_fld223,1,1)='0' ) UPDATE T SET _fld224=N; _fld223 - гуид, там может быть 16 вариантов символов 0-f. Получается 16 примерно одинаковых порций по 4.5 млн. Сейчас первая порция обрабатывается 3 часа. |
14 май 19, 16:43 [21884605] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Почитайте здешний FAQ по этому вопросу (такая тема там есть). |
||
14 май 19, 19:11 [21884735] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
leonix, Может быть быстрее будет так: создаёте новую таблицу копию существующей. делаете insert select в нее с новой идентити. профит. |
15 май 19, 03:26 [21884885] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
(4335883 rows affected) Первая порция отработала за 13 часов. Осталось 15 порция. Годится. Это разовая операция. |
15 май 19, 08:34 [21884935] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
leonix, исправь пока не поздно, а то не видать тебе нормальной нумерации: WITH T AS ( SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* FROM [dbo].[_InfoRg222] ) UPDATE T SET _fld224=N where SUBSTRING(_fld223,1,1)='0'; |
15 май 19, 09:31 [21884972] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Ведь так следующая порция опять пронумеруется с 1. Надо прибавить к количеству уже пронумерованных записей. |
||
15 май 19, 09:33 [21884976] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||||
15 май 19, 09:34 [21884979] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Уверен? По идее пронумеровываются все строки, а обновляются только по условию. |
||
15 май 19, 09:40 [21884985] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Я же писал что переосмыслил задачу. Сначала хотел сквозную нумерацию. Сейчас решил что в рамках поля _fld223. Короче это таблица с историей изменений объектов. _fld223 это гуид объекта. _fld224 номер версии. _fld251 дата изменения. |
15 май 19, 09:45 [21884991] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Но тогда как раз надо сделать, чтобы нумеровались только оставшиеся записи. Это должно улучшить производительность. |
||||
15 май 19, 09:50 [21884993] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
тогда должно быть (PARTITION BY _fld223 order by _fld251) |
||
15 май 19, 09:54 [21884996] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |