2016-11-03 1 views
0

У меня есть несколько уродливая проблема с существующей базой данных. Эта база данных имеет Transaction_Items таблицу, которая содержит элементы строки для каждой операции (упрощенно):«Вставить» новую строку с наименьшим идентификатором в SQL Server

Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name 
----------------------------------------------------------------- 
1          12345   Service1 
2          12345   Service2 
3          12345   Service3 
4          12346   Service1 

Эти операции показывают на счете-фактуре и приложения всегда упорядочивает их на тот счет-фактуру на основе Transaction_Item_ID.

Мне нужно добавить элемент обслуживания к конкретным транзакциям, которые всегда будут отображаться первыми, назовем его имя объекта MEMO. В противном случае предметы должны оставаться в том же порядке. Поэтому для этого элемента MEMO всегда необходимо иметь самый низкий Transaction_Item_ID из тех, которые соответствуют транзакции. Потому что Transaction_Item_ID - это столбец автоматической идентификации. Я не могу просто изменить его на меньшее значение. Я думаю, что в основном мне нужно обновить Item_name первой строки до MEMO, копируя существующее имя элемента в следующую нижнюю строку и так далее, пока предыдущее значение последней строки не будет вставлено в новую строку.

Вопрос в том, как это сделать или если есть лучший способ достичь того же результата.

В основном заканчивается так:

Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name 
----------------------------------------------------------------- 
1          12345   MEMO 
2          12345   Service1 
3          12345   Service2 
4          12346   Service1 
5          12345   Service3 

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

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

Да, это уродливое и далекое от идеала. К сожалению, работа с устаревшими приложениями и использование лучших из них - это реальность во многих бизнесах. По крайней мере, у меня действительно есть доступ на чтение/запись в базу данных.

+4

Это не то, что нужно сделать, ИМО. Вы должны действительно просто изменить запрос, который тянет данные из таблицы, чтобы иметь собственный заказ заявление. например 'Заказ на случай, когда item_name =«памятка», то 0 еще один конец, transaction_item_id' – ZLK

+0

Почему вы не вставить, что со значением' -1' для 'transaction_item_id'? –

+0

Вы ** не можете ** обновить существующее значение в столбце «identity» - SQL Server позволяет ** вставлять ** определенные пользовательские значения с помощью команды «SET IDENTITY_INSERT ON», но вы можете ** никогда не обновлять существующего значения столбца 'identity'. –

ответ

1

Мне не нравится ваша идея обновления каждой строки.

Ваше самое простое решение в этом случае - переименовать эту таблицу и использовать ее в качестве промежуточной таблицы, а затем выполнить вставку в новую таблицу (которая имеет имя, используемое вашей исходной таблицей), с использованием желаемого порядка.

Или измените порядок в приложении.

+0

Спасибо, но см. Мое редактирование. У меня нет доступа к изменению приложения или изменению таблицы. Радости устаревшего программного обеспечения от мертвых компаний. – Thildemar

+0

Какие права DB у вас есть?Проверьте свой логин пользователя/AD в БД (в SSMS: перейдите в папку db, где хранятся данные -> безопасность -> пользователи -> щелкните правой кнопкой мыши по вашей логин/группа AD -> свойства -> членство) – TJB

+0

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