0

「ORDER」列を使用して結果がソートされるテーブルがあります。

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 つの順序を簡単に切り替えることができます。

それはうまく機能しますが、同じ方法でセットアップする必要がある2番目のテーブルがあり、もっと良い方法があると確信しています. 何か案が?

4

3 に答える 3

3

あなたのコメントに基づいて、私はあなたが非常に実行可能な解決策を持っていると思います. デフォルトとして指定することで、もう少し使いやすくすることができます。

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

別の方法として、挿入後に ID フィールドを 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 を ID 列として定義する例:

create table Documents (
    doc_id int identity primary key,
    doc_order int,
    doc_value ntext
)
于 2009-05-11T13:47:37.813 に答える
1

初期値を取得したらオーバーライドできるID列が必要なようです。1 つの解決策は、自動インクリメント ID 列である "InitialOrder" と呼ばれる 2 つの列と、最初に InitialOrder フィールドと同じ値に設定される doc_order と呼ばれる 2 番目の列 (おそらく、その方法で挿入を行う場合はトリガーまたはストアド プロシージャを挿入します) が、ユーザーがその列を編集できるようにします。

レコードごとに余分な数バイトが必要ですが、問題は解決します。値が少しでもある場合は、最初のドキュメントの順序とユーザーのリセットの順序の両方が利用可能になります。

また、doc_order を一意にする必要があるかどうかはわかりませんが、そうでない場合は、戻り値を doc_order と InitialOrder で並べ替えて、一貫した戻りシーケンスを確保できます。

于 2009-05-11T13:57:50.027 に答える
0

その DOC_ORDER 値を制御する必要がない場合は、ID 列を使用してみてください。

于 2009-05-11T13:49:43.380 に答える