ホームページ >データベース >SQL >SQL サーバーの高い同時実行性により、一意の注文番号が生成されます

SQL サーバーの高い同時実行性により、一意の注文番号が生成されます

藏色散人
藏色散人転載
2020-08-29 12:01:382765ブラウズ

#まえがき

数日前、私は一意の注文番号を生成する方法に関する記事を書きました。 MySQL の高い同時実行性、誰かが SQL サーバーのバージョンがあるかどうかを尋ねるプライベート メッセージを送信しました。今日の正午、私は一意の注文番号を生成する SQL サーバー バージョンの高い同時実行性の実装を書きました。実際、MySQL の原則とSQL サーバーは同じです。主な理由は、構文の一部が異なるため、この記事の本文の説明はほぼ同じであり、コードとインターフェイスが異なるだけです。

推奨:「

SQL チュートリアル

1. シナリオの再現

ERP 購買・販売システムや 0A などのシステムがある場合注文番号を生成する操作を同時に実行すると、複数の人が同じ注文番号を取得することが容易になり、会社のビジネスに取り返しのつかない損失が発生します

2. 同時実行性が高い状況を回避する方法注文番号が一意ではない場合

ストアド プロシージャとデータ テーブルを使用してテーブルを構築し、ストアド プロシージャを作成できます。ストアド プロシージャは注文番号を生成し、テーブルは一意性の問題を処理します。


SQL サーバーの高い同時実行性により、一意の注文番号が生成されますストアド プロシージャが注文番号を生成するときは、最初に注文番号をテーブルに書き込み、次に注文番号の結果を表示します。生成された注文番号をテーブルに書き込むとき、2 つの状況が発生します。理由?このテーブルには主キー (主キーの一意性) があるため、

    # と書くことができます: テーブル内に同じ注文番号がない場合、生成された注文番号がテーブルに書き込まれます
  • 書き込み不可:テーブル内に同じ注文番号が存在する場合、生成した注文番号をテーブルに書き込むことができず、注文番号を取得できないため、一意の注文番号が確保されます。
  • 3. 高い同時実行条件で一意の注文番号を生成するプロセス

次に、一意の注文番号を生成するプロセスについて説明します。コードと実際の操作を使用する

ステップ 1: データ テーブルを作成し、注文番号フィールドを主キー (一意の注文番号のキー) として設定します

#ステップ 2: 注文番号を生成するストアド プロシージャを作成する SQL サーバーの高い同時実行性により、一意の注文番号が生成されます
生成される注文番号の形式は次のとおりです: カスタム プレフィックス 年、月、日のサフィックス (001、002、003) 1. まずストアド プロシージャを作成します

パラメータは @BILL_TYPE

CREATE  PROCEDURE [dbo].[GetBillNO]
 @BILL_TYPE nvarchar(3)

2. 年、月、日、サフィックスを生成します

年、月、日は次のとおりです。現在のシステム時刻、サフィックスの初期値は 0

declare @BILL_NO nvarchar(15);declare @currentDate nvarchar(15);declare @lastno INT = 0;set @currentDate = Convert(varchar(10),Getdate(),112);

3 です。クエリ フォーム、テーブルの順序番号を取得します。

テーブルにクエリ、テーブルの順序番号を取得します。カスタム コンテンツに関連するプレフィックスを付けた最新の注文番号を @BILL_NO

select @BILL_NO = isnull(BILL_NO,0)
    FROM temp_bill 
    WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and
    SUBSTRING(BILL_NO,4,8) =@currentDate

4 に割り当てます。注文番号を生成します

If前の手順で取得した注文番号が空ではない場合、新しく生成される注文番号は元の注文番号 1
  • の 1 になります。例: 取得した注文番号: QNB20200615015

    つまり、生成される注文番号は次のようになります。 QNB20200615016


    前の手順で取得した注文番号が空の場合、新しく生成される注文番号のサフィックスは 001
  • 例: 生成される注文番号 :QNB20200615001

    IF @BILL_NO !='' begin
     SET @lastno = str(right(@BILL_NO, 3)+1) ; 
     set @BILL_NO = @BILL_TYPE+@currentDate+RIGHT('000'+CAST(@lastno as varchar),3);
     end;ELSE  begin
     set @BILL_NO = @BILL_TYPE+@currentDate+CAST('001' as varchar(20));END;
    これを実行したとき、SQL サーバーには LPAD 機能がなかったため (足りない桁数を自動的に補完してくれる)、文字列のスプライシングを使用してから、 right をクリックして右側の 3 を取得します。目標は達成され ( ̄﹃ ̄)、デッドです

5。生成された注文番号をテーブルに挿入します

If the同じ注文番号がテーブルに存在する場合、テーブルへの挿入は失敗します 同じ注文番号がテーブルに存在しない場合、テーブルへの挿入は成功します

insert into Temp_Bill(BILL_NO,BILL_TYPE) values(@BILL_NO ,@BILL_TYPE )


6。一意の注文番号

注文がテーブルに正常に挿入されると、一意の注文番号が返されます (上記の 1 つのステップが失敗した場合、このステップは実行されません)

select @BILL_NO as BILL_NO
4. 実行結果

1. まず、テーブルにはデータがなく、プレフィックスが生成されます (UIE と入力しました) 年月日 (20200615) 001 (最初のデータなので、それは 001)

つまり:

QNB20200615001


2 2 回目に入力すると、テーブルにデータがあるため、最新の注文番号に従って、サフィックスに 1 を追加します:

QNB20200615002



5. 古いルールSQL サーバーの高い同時実行性により、一意の注文番号が生成されます

この記事がすべての人に役立つことを願っています

十分なポイントがある場合は、ダウンロードしてください。ポイントがない場合は、画像を入力してください。とにかくコードの量は多くありません。

あなたが学生でポイントがない場合は、個人的に私にメッセージを送ってください。ソースコードを無料でお送りします

コードのダウンロード リンク: SQL server_getbillno.bak
コードのスクリーンショット:


以上がSQL サーバーの高い同時実行性により、一意の注文番号が生成されますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。