2011-01-26 13 views
3

デフォルトのボタンをクリックすると一意の識別子を生成できるSQLコーディングがありますか?私は彼らがストレージに配置される前に、物理的な紙のファイルに番号を付けるシステムを探しています。問題は3つのオフィスがあり、各オフィスでは連続番号システム(P001、P002、P003、C001、C002 ...)が必要です。以下はSQLを使用して一意の識別子を作成

は私がこれまでに固有のID番号にプレフィックスを生成する必要がコードです。

SELECT CASE WHEN ptBranch=3 THEN 'P' WHEN ptBranch=4 THEN 'A' ELSE 'C' END + CONVERT(VARCHAR(2),GETDATE(),12) FROM LAMatter WHERE ptMatter = $Matter$

アイデアは、コードはファイル全体の番号を生成することができることになります例えばP110001、P110002(P、CまたはAがファイル内にある事務所であり、11は、ファイルがストレージに入れた年を表す)

任意のポインタが大幅

+1

「順次」アスペクトはどれくらい重要ですか?失敗したインサートによって左に隙間ができますか? –

+0

残念なことに本当に重要です - ファイルがストレージから紛失した場合(アーカイブが常時取り込まれた後に)、物理的に簡単に識別できるようになります。明らかに、数字が間違っていれば、わかりませんファイルが見つからないか番号が割り当てられていない場合 –

+0

「ID」が完全に排除されていれば、これはまったく保証されません(3つの異なるテーブルを持っていてもロールバックされたトランザクションとのギャップが残る可能性があります) –

答えて

11

を理解SQL Serverの機能newid()を生成しますGUID

あなたのSQLクエリはボタンなどを生成しません。 SQLは、データベースに問い合わせるための言語であり、ソフトウェアインタフェースを記述するためのものではありません。

+0

Danさん、ありがとうございましたが、私はincramental unquie識別子(0001、0002、0003)を考えていました。 –

+0

はい、ID列を作成します。これにより、コードを記述することなく自動的にインクリメントする識別子が生成されます。 –

+0

あなたは役に立つチュートリアルを教えてくれますか? –

0

私は質問の最初のフレージングによって引き起こさ誤解があったかもしれないと思います。

私は今、あなたは、各事業所がボタンをクリックするだけで、彼らはファイルを処理するたびに、新たな保証シーケンシャル番号を生成できるようにする必要がありますするプロセスが必要であることを想定していますか?

次に、欠落している可能性のあるファイルを調べるために、シーケンス内のギャップが追跡されます。あれは正しいですか?

もしそうなら、このようなものを使って数字を生成することができます。

CREATE TABLE Sequences 
(
OfficeCode char(1) primary key, 
SequenceNumber int NOT NULL DEFAULT (0) 
) 

INSERT INTO Sequences(OfficeCode) 
SELECT 'P' UNION ALL SELECT 'C' UNION ALL SELECT 'A' 

GO 

CREATE PROC dbo.GetSequence 
@OfficeCode char(1), 
@val AS int OUTPUT, 
@n as int =1 
AS 
UPDATE dbo.Sequences 
SET @val = SequenceNumber = SequenceNumber + @n 
WHERE OfficeCode = @OfficeCode; 

SET @val = @val - @n + 1; 

GO 


DECLARE @val int 

EXEC dbo.GetSequence 'C', @val output 
select @val 
+0

最初に、ファイルがアーカイブに保存される必要があるとき、各オフィスはボタンをクリックし、次のアーカイブ番号を順番に与えます(これはファイルに書き込まれ、ストレージに置かれます) ...ときにはフィールズが倉庫から戻ってくることもありますが、私たちはその隙間を予約していますので、紛失していることを知っています(誰か他の人がリクエストした場合)...意味がありますか?私たちは合意に達していますか?コードに関しては、私は自分のシステムにそれを実装する方法の最初のアイデアを持っていません申し訳ありません、私の現在の理解を超えて –

+0

私は遊びましたが、悲しいことにデータベースは私にはもっと多くのカスタムビルドビルダー。 SQLのレベルは、ビルダー内で見ることができ、元の質問にあるものと同じです。 –

0

作成日時にrow_number関数を使用します。バッチを挿入している場合は、row_number関数のidカラムを使用して注文することもできます。

declare @records table (id int identity(1,1), CreationDate datetime, Name varchar(50), Section char(1), FileID varchar(10)) 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:57:49', 'abc','p' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:57:50', 'def','p' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:58:00', 'ghi','c' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:58:50', 'jkl','d' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:58:51', 'mno','c' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:58:52', 'pqr','p' 

insert into @records (CreationDate, Name, Section) 
select '2011-01-26 16:58:53', 'def','p' 

update @records 
set FileID=a.FileID 
from 
(
    select id, 
    Section + cast(row_number() over (partition by Section order by CreationDate, Section) as varchar(10)) as FileID 
    from @records 
) a 
    inner join @records b 
     on a.id=b.id 

select * from @records 
関連する問題