2009-05-11 11 views
0

に私は結果が「ORDER」の列、例えばを使用してソートされているテーブルがあります。は、カスタムソートSQL Serverの

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

を私の問題は、当初のように効率的かつreusablyできるだけこの順序列を設定することです。

私の最初のテイクは新しいエントリがテーブルに追加され、デフォルト値として使用することができスカラ関数を設定することでした:

ユーザーが2つの文書を入れ替えたい
ALTER FUNCTION [dbo].[Documents_Initial_Order] 
() 
RETURNS int 
AS 
BEGIN 

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

、私ができます2つの注文を簡単に切り替えることができます。

これはうまく動作しますが、同じ方法で設定する必要がある2番目のテーブルが作成されました。これを行うにはより良い方法があると確信しています。何か案が?

答えて

1

ID列を最初の値に設定した後でオーバーライドできるように思えます。 1つの解決策は、自動インクリメントID列である「InitialOrder」と、最初はInitialOrderフィールドと同じ値に設定されたdoc_orderという2つ目の列という2つの列を持つことです(おそらくはInsertを使用している場合はトリガーまたはストアドプロシージャを挿入します)、ユーザーにその列を編集できるようにします。

レコードごとに余分なバイト数が必要ですが、問題が解決しても、何らかの価値がある場合は、ドキュメントの順番とユーザーリセット注文の両方を利用できます。

また、doc_orderが一意である必要があるかどうかはわかりませんが、そうでない場合は、doc_orderとInitialOrderで戻り値をソートして、一貫した戻りシーケンスを確保してください。

+0

(私が最後に使用した解決策はそれほど多くありませんでした) – Luk

3

あなたのコメントに基づいて、あなたは非常に実行可能な解決策があると思います。あなたがデフォルトとして指定することにより、それはもう少しユーザーフレンドリー作ることができます:

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 

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

別の方法として、あなたはその挿入後のコピーdoc_orderフィールドへのIDフィールドを更新トリガーを作成することができますID列としてDOC_ID定義

例:

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

良い点ですが、私はユーザーが注文を微調整できるようにする必要があります(2つのドキュメントを並べ替えるため)。アイデンティティを使用している場合、これは苦労します。 – Luk

+0

ここでdoc_orderはIDENTITY列ではありません –

+0

@Tom H:そうですか?それ以外は誰が言ってるの? – Andomar

0

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

+0

良い点ですが、ユーザーは注文を微調整できる必要があります(2つのドキュメントを並べ替えるため)。アイデンティティを使用している場合、これは苦労します。 – Luk