Вопрос

У меня есть таблица, в которой результаты сортируются по столбцу «ПОРЯДОК», например:

Doc_Id    Doc_Value   Doc_Order
1         aaa         1
12        xxx         5
2         bbb         12
3         ccc         24

Моя задача состоит в том, чтобы изначально настроить этот столбец заказа максимально эффективно и многократно.

Моей первоначальной задачей было настроить скалярную функцию, которую можно было бы использовать в качестве значения по умолчанию при добавлении новой записи в таблицу:

ALTER FUNCTION [dbo].[Documents_Initial_Order] 
( )
RETURNS int
AS
BEGIN

RETURN (SELECT ISNULL(MAX(DOC_ORDER),0) + 1 FROM dbo.Documents)

Когда пользователь хочет поменять местами два документа, я могу легко переключить эти два порядка.

Это работает хорошо, но теперь у меня есть вторая таблица, которую нужно настроить таким же образом, и я совершенно уверен, что есть более удобный способ сделать это.Есть идеи?

Это было полезно?

Решение

Похоже, вам нужен столбец идентификаторов, который затем можно переопределить, как только он получит начальное значение.Одним из решений было бы иметь два столбца: один раз вызывается «InitialOrder», который представляет собой столбец идентификаторов с автоматическим приращением, а затем второй столбец с именем doc_order, которому изначально присвоено то же значение, что и поле InitialOrder (возможно, даже как часть вставьте триггер или хранимую процедуру, если вы вставляете таким образом), но дайте пользователю возможность редактировать этот столбец.

Это требует дополнительных нескольких байтов на запись, но решает вашу проблему, и если это вообще имеет какое-либо значение, у вас будут доступны как исходный порядок документов, так и порядок сброса пользователем.

Кроме того, я не уверен, должен ли ваш doc_order быть уникальным или нет, но если нет, вы можете отсортировать возвращаемые значения по doc_order и InitialOrder, чтобы обеспечить согласованную последовательность возврата.

Другие советы

Судя по вашему комментарию, я думаю, что у вас есть очень работоспособное решение.Вы можете сделать его немного более удобным для пользователя, указав его по умолчанию:

alter table documents
  add constraint constraint_name 
  default (dbo.documents_initial_order()) for doc_order

В качестве альтернативы вы можете создать триггер обновления, который копирует поле идентификатора в поле doc_order после вставки:

create trigger Doc_Trigger
on Documents
for insert
as
update d
set d.doc_order = d.doc_id 
from Documents d
inner join inserted i on i.doc_id = d.doc_id

Пример определения doc_id как столбца идентификаторов:

create table Documents (
    doc_id int identity primary key,
    doc_order int,
    doc_value ntext
)

Если нет необходимости контролировать, каким может быть значение DOC_ORDER, попробуйте использовать столбец идентификаторов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top