あなたはMS SQL-Serverを使用している場合は、私はに新しいレコードとCLR(スカラー値関数)を挿入するために、データベース内のストアドプロシージャを使用します次の請求番号を取得します。このようにして、番号が一意であることを確認できます。
SPは、次のようになります。次の番号がMAX(BillNumber)+1
なり
CREATE PROCEDURE [dbo].[InsertBill]
@idBill int OUTPUT,
@CreationDate datetime OUTPUT,
@Name varchar(50) OUTPUT,
@BillNumber char(10) OUTPUT
with execute as Owner
AS
INSERT INTO tBill(CreationDate, Name, BillNumber)
VALUES (GetDate(), @Name, dbo.GetNextBillNumber())
;SELECT @idBill=idBill,@CreationDate=CreationDate, @Name=Name, @BillNumber=BillNumber
FROM tBill WHERE (@idBill = SCOPE_IDENTITY())
、フォーマットは、10文字(A + 9桁)、次の紙幣番号を生成するためのCLRである:
CREATE FUNCTION [dbo].[GetNextBillNumber]()
RETURNS CHAR(10)
AS
BEGIN
DECLARE @BillNumber CHAR(10);
DECLARE @nextBillNumber int;
SET @nextBillNumber = CONVERT(int,SUBSTRING((SELECT MAX(BillNumber) FROM tBill),2,9)) + 1;
SET @BillNumber = 'A' + RIGHT('000000000'+ CONVERT(VARCHAR,@nextBillNumber),9)
return @BillNumber
END
注:100%テストされたわけではありませんが、私が意味するものを理解する必要があります。
編集:また、一意性を保証するにはadd a unique constraintにする必要があります。同じBill-Numberを持つ2つのレコードを挿入するのは技術的に不可能です。この例では、テーブルのprimary-keyはビル番号自体ではなく、Is Identity(自動インクリメント、here with SSMS)のint-columnであると推定しています。
Hereは、ADO.NETからストアドプロシージャを呼び出す方法に関する情報です。
これは実際にはあまり明確ではありません。各人に1(または0)から戻ってくるユニークな番号が必要ですか、それとも何人かの人にかかわらず領収書ごとに連続的に増分するユニークな番号ですか?あなたはDB内でユニークなインデックスを使用することができ、それがあなたがしようとしている場合は、ラージ数を取得し、それをインクリメントする関数を持っているが、私はあなたが求めているものであることを確信していません。 –
あなたはどのデータベースを使用していますか? –