2

以下の形式に示すように、個々の注文ごとに varchar 自動インクリメント主キー (注文 ID) 値を生成したいと考えています。

「O201307270001」

注文 の場合は「O」、日付 (2013 年 7 月 27 日) の場合は「20130727」、自動増分値の場合は「0001」

新しい日が始まると、自動インクリメントされた数字(上記のIDの最後の4つの数字)を「1」から再開したい。

以下は、異なる時間と日に行われた注文に対して注文 ID を生成する方法の例です。

O201307270001   when date is like '2013-07-27 01:23:45.235'
O201307270002   when date is like '2013-07-27 03:12:22.212'
.
.
.
O201307270040   when date is like '2013-07-27 11:34:56.189'
.
.
//Now when new day starts:
O201307280001   when date is like '2013-07-28 00:00:00.000'
O201307280002   when date is like '2013-07-28 00:13:05.000'

私を助けてください、どうすればそれができますか

4

6 に答える 6

2

これが私が提案するものです。これには、(かなり大きな:))ターゲットテーブルを読み取らないという利点があり、テーブルが大きくなるにつれてパフォーマンスが向上します。

短いストアド プロシージャとパラメーター テーブルを作成する必要があります。

ストアド プロシージャを呼び出すだけで、正しい Id が返されます。

DECLARE @NewOrderId AS CHAR(13)

EXEC usp_NewOrderId @NewOrderId OUTPUT

SELECT @NewOrderId

これはあなたが作成する必要があるものです:

CREATE TABLE OrderNumberGenerator (
  Id INTEGER IDENTITY(1,1),
  CreatedDate DATE DEFAULT(GETDATE()) 
 )
GO

CREATE PROCEDURE usp_NewOrderId 
(@NewOrderIdOut char(13) OUTPUT ) 
AS 
BEGIN

   IF EXISTS (SELECT 1 FROM OrderNumberGenerator WHERE CreatedDate <> CAST(GETDATE() AS DATE) )
    TRUNCATE TABLE OrderNumberGenerator --restart the counter everyday :)

  INSERT INTO OrderNumberGenerator DEFAULT VALUES

  SELECT @NewOrderIdOut = 
  'O' +
  CONVERT(CHAR(8), GETDATE(), 112) +
  RIGHT( '000' + CAST(SCOPE_IDENTITY() AS VARCHAR(4)) ,  4 ) 

END

ここでチェックしてください http://sqlfiddle.com/#!3/fdb91/4

于 2013-07-27T16:28:08.277 に答える
0

これを試して

DECLARE @autoInc VARCHAR(25)
SET @autoInc='O'+(SELECT convert(varchar, getdate(), 112))+
               CAST(((SELECT COUNT(*) 
                     FROM table 
                 WHERE autoColumn like 'O'+(SELECT convert(varchar, getdate(),112))+'%') 
                       +1 ) AS VARCHAR(5))
于 2013-07-27T16:22:20.100 に答える
0

他の回答がすでに指摘しているように、これを行うのは悪い考えかもしれませんが、とにかくしたいのであれば、このコードはあなたが望むことを達成するはずです。すべてのコーナーケースを試したわけではありませんが、小さなテストデータが機能していれば.

私が試したいくつかのテストデータ:

declare @tab table (pk char(13))
insert @tab values ('O201307270001')
insert @tab values ('O201307270002')
insert @tab values ('O201307270003')
insert @tab values ('O201307278999')
insert @tab values ('O201307280001')
insert @tab values ('O201307280002')
insert @tab values ('O201307290001')

そして、実際のコード:

SELECT 
  CASE ISNULL(MAX(RIGHT(pk,4)),0) 
    WHEN 0 THEN 'O' + CONVERT(CHAR(8),GETDATE(),112) + '0001' 
   ELSE 'O' + CONVERT(CHAR(8),GETDATE(),112) + RIGHT(CAST(MAX(RIGHT(pk,4)) + 10001 AS CHAR(5)),4) END 
FROM @tab 
WHERE SUBSTRING(pk,2,8) = CONVERT(CHAR(8),GETDATE(),112)

理想的には、関数にラップする必要があり、おそらくロックも使用して、同じキーが 2 回渡されるのを回避します。

于 2013-07-27T16:22:37.387 に答える
0

この varchar で生成されたコードをテーブルの主キーとして使用せず、代わりに数値を使用し、この生成された文字列を注文コードとして別の列に保存することを強くお勧めします (これにより、将来のクエリで悪夢から逃れることができます)。このコード列に「一意」のフラグを付けて、同じ結果を得ることができます。

注文コードの生成方法についてですが、背後のロジックがオートインクリメントなどの基本的なものでない場合は、このドンデをシステムの上位レイヤー (存在する場合) に配置することをお勧めします。

于 2013-07-27T16:06:44.153 に答える
0

これは、INSTEAD OF INSERTトリガーを使用するか、CreateOrderストアド プロシージャを使用することをお勧めします。

従う必要がある手順は次のとおりです。

  1. 現在の日付のプレフィックスを計算します。'O' + CONVERT(char(8), GETDATE(), 112)
  2. 表から最終注文番号を選択します。SELECT MAX(OrderNum) FROM Order
  3. 最後の注文番号に現在の日付の接頭辞がある場合は、数値の接尾辞を抽出して増分し、日付の接頭辞に追加します。WHEN @CurrentPrefix = LEFT(@LastOrder, 9) THEN @CurrentPrefix + RIGHT('000' + (CONVERT(int, RIGHT(@LastOrder, 4)) + 1))
  4. それ以外の場合は0001、接尾辞として使用してください。ELSE @CurrentPrefix + '0001'
  5. 生成されたキーを使用して挿入を実行します。
于 2013-07-27T16:17:33.127 に答える
0

CREATE TABLE OrderNumberGenerator ( [ID] INTEGER IDENTITY(1,1), [New_ID] AS 'O'+CONVERT(varchar) ) GO

于 2013-12-11T07:08:21.463 に答える