2016-10-21 16 views
1

私はMicrosoft SQL Server 2014を使用しています。私たちの要件では、カスタム形式のシーケンス番号が含まれています。SQL Server:自動生成カスタム形式のシーケンス番号

CAT-YYYY-MM-NNNNNNです。サンプルデータ:

CAT-2016-10-000001 
CAT-2016-10-000002 
       . 
       . 
       . 
CAT-2016-10-999999 

私はGUIDや他のを使用したくないと私はプロシージャまたは関数で仕事をしたいです。

だから、私はこれをしようとしています:私は、ステップバイステップで上記のSQLを実行すると

CREATE TABLE [category] 
(
    [id] int NOT NULL UNIQUE IDENTITY, 
    [category_no] nvarchar(20) NOT NULL, 
    [category_name] nvarchar(50) NOT NULL, 
    PRIMARY KEY ([id]) 
); 

CREATE FUNCTION generate_category_no() 
RETURNS CHAR(20) 
AS 
BEGIN 
    DECLARE @category_no CHAR(20) 
    SET @category_no = (SELECT MAX(category_no) FROM category) 

    IF @category_no IS NULL 
     SET @category_no = 'CAT-' + YEAR(getDate()) + '-' + MONTH(getDate()) + '-000001' 

    DECLARE @no int 
    SET @no = RIGHT(@category_no,6) + 1 

    RETURN 'CAT-' + YEAR(getDate()) + '-' + MONTH(getDate()) + '-' + right('00000' + CONVERT(VARCHAR(10),@no),6) 
END 
GO 

ALTER TABLE category DROP COLUMN category_no; 
ALTER TABLE category ADD category_no AS dbo.generate_category_no(); 

INSERT INTO category (category_name) 
VALUES ('BMW'), ('JAGUAR'); 

、それはOKです。それはエラーを示さなかった。私は、次のコマンドを実行したときにでも、私はこの1つを解決する方法がわからない

Msg 217, Level 16, State 1, Line 1
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

SELECT * FROM category; 

は、それは次のようなエラーが表示されます。そして、私の機能が働いているかどうかはわかりません。私はこの機能についてインターネットから参照しました。

は、私は毎月のために何の順序をリセットする必要がありません

を追加しました。例えば。来月には、次のようにする必要はありません。

CAT-2016-11-000001 

私を啓発してください。前もって感謝します!他の挿入のために

ALTER TABLE category DROP COLUMN category_no; 
ALTER TABLE category ADD category_no CHAR(20) 

UPDATE category set category_no = dbo.generate_category_no() 

があなたの新しいフィールドを初期化するには:

+0

同時に2つのセッション(SELECT MAX(category_no)FROMカテゴリ)を実行するとどうなりますか?誰が+1値を取得しますか? –

+0

テーブルから、または関数の実行中または関数の作成中にデータを選択する際にエラーが発生していますか?テーブルに関連付けられたトリガーはありますか? – Aditya

+0

いいえ、dbにトリガーはありません。この機能のみ。 –

答えて

0

最後に、私はこの問題を解決しました。

CREATE FUNCTION generate_category_no() 
RETURNS CHAR(20) 
AS 
BEGIN 
    DECLARE @category_no CHAR(20) 
    SET @category_no = (SELECT MAX(category_no) FROM category WHERE category_no LIKE CONCAT('CAT-', YEAR(getDate()), '-', MONTH(getDate()), '-%')) 
    IF @category_no is null SET @category_no = CONCAT('CAT-', YEAR(getDate()), '-', MONTH(getDate()), '-000000') 
    DECLARE @no INT 
    SET @no = RIGHT(@category_no,6) + 1 
    RETURN CONCAT('CAT-', YEAR(getDate()), '-', MONTH(getDate()), '-', RIGHT('00000' + CONVERT(VARCHAR(10),@no),6)) 
END 
GO 

そして、私は次のようにデータを挿入:マイ機能は、以下のように見える

INSERT INTO category (category_no, category_name) VALUES (dbo.generate_category_no(),'BMW'); 
INSERT INTO category (category_no, category_name) VALUES (dbo.generate_category_no(),'JAGUAR'); 

一つの物事は我々がINSERTクエリから関数を呼び出すことができますということです。私は、次のSQLを実行したときに

ので、下記に示すよう

SELECT * FROM category; 

それは結果を与えます。

+---+--------------------+--------------+ 
|id |category_no   |category_name | 
+---+--------------------+--------------+ 
| 1 |CAT-2016-10-000001 | BMW   | 
| 2 |CAT-2016-10-000002 | JAGUAR  | 
+---+--------------------+--------------+ 

皆さんありがとうございました。ありがとう!!!

1

これを試してみてください

CREATE TRIGGER [dbo].[category_i] 
ON [dbo].[category] 
AFTER INSERT 
AS BEGIN 
    UPDATE category 
    SET category_no = dbo.generate_category_no() 
    FROM inserted 
    WHERE category.pk = inserted.pk 
END 

しかし、あなたは2012年のSQL Serverで利用できるSEQUENCE機能を使用しようとすることができますバージョン

SEQUENCEをご覧ください。here

+0

トリガーは私の目的ではないので、私はちょうどあなたの答えをupvote。あなたの答えは正しい方法です。しかし、私はちょうど列の関数を使用したい。さて、私はそれを得た。ありがとう。 –

+1

@NaingWinHtun:こんにちは、あなたのupvoteありがとうございます。明らかに答えがあなたの目標を達成するので、それはあなたのものを受け入れました;)素敵な一日 –

1
あなたの関数で

最大の欠陥は、それがバッチのために動作しませんで挿入の

あなたがID自動生成していますので、ここではこの

category_no AS Concat('CAT-', Year(Getdate()), '-', Month(Getdate()), '-', RIGHT(Concat('00000', id), 6)) 

デモを行うための簡単な方法がある

CREATE TABLE #seq 
    (
    id INT IDENTITY(1, 1), 
    name VARCHAR(10), 
    category_no AS Concat('CAT-', Year(Getdate()), '-', Month(Getdate()), '-', RIGHT(Concat('00000', id), 6)) 
) 

INSERT INTO #seq 
      (name) 
VALUES  ('val') 

結果:

id name category_no 
-- ---- ----------- 
1 val  CAT-2016-10-000001 
2

は、以下の結果が得られますカテゴリから

ALTER TABLE category DROP COLUMN category_no; 

alter FUNCTION dbo.generate_category_no(@id int) 
RETURNS CHAR(20) 
AS 
BEGIN 

    RETURN 'CAT-' + cast(YEAR(getDate()) as varchar(10)) + '-' + cast(MONTH(getDate()) as varchar(10))+ '-' + right('00000' + CONVERT(VARCHAR(10),@id),6) 
END 



ALTER TABLE category ADD category_no AS dbo.generate_category_no(id); 

INSERT INTO category 
(category_name) 
VALUES 
('BMW13'), 
('JAGUAR'); 

SELECT *以下のようにあなたの関数を変更します。

1 BMW  CAT-2016-10-000001 
2 JAGUAR CAT-2016-10-000002 
3 BMW1 CAT-2016-10-000003 
4 BMW13 CAT-2016-10-000004 
+0

良い解決策、ちょうど注:category_noにidをリンクしています。ギャップの同じ範囲。それは質問者ビジネスの問題かどうか? –

+1

次に、カテゴリからのCATIDとして、以下のクエリのselect id、category_name、 'CAT-2016-10-00000' + cast(row_number()by varchar(10)) – User

関連する問題