私は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()
:
があなたの新しいフィールドを初期化するには:
同時に2つのセッション(SELECT MAX(category_no)FROMカテゴリ)を実行するとどうなりますか?誰が+1値を取得しますか? –
テーブルから、または関数の実行中または関数の作成中にデータを選択する際にエラーが発生していますか?テーブルに関連付けられたトリガーはありますか? – Aditya
いいえ、dbにトリガーはありません。この機能のみ。 –