Пользовательская сортировка в SQL Server - PullRequest
0 голосов
/ 11 мая 2009

У меня есть таблица, в которой результаты сортируются с использованием столбца «ЗАКАЗАТЬ», например:

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)

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

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

Ответы [ 3 ]

3 голосов
/ 11 мая 2009

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

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
)
1 голос
/ 11 мая 2009

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

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

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

0 голосов
/ 11 мая 2009

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

...