[英]SQL Server: auto-generated custom format sequence number
我正在使用Microsoft SQL Server2014。在我們的要求中,包括自定義格式的序列號。
序列號格式為CAT-YYYY-MM-NNNNNN
。 樣本數據:
CAT-2016-10-000001
CAT-2016-10-000002
.
.
.
CAT-2016-10-999999
我不想使用GUID或其他任何東西,而是想使用一個過程或函數。
所以,我正在嘗試:
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');
當我逐步運行上述SQL時,就可以了。 它沒有顯示錯誤。 但是當我運行以下命令時:
SELECT * FROM category;
它顯示以下錯誤:
消息217,第16級,狀態1,第1行
超出最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)。
我不知道如何解決這個問題。 甚至我都不知道我的功能是否起作用。 我從互聯網上引用了此功能。
添加
我需要每月重新設置序列號。 例如。 下個月的否應為:
CAT-2016-11-000001
拜托,請賜教。 提前致謝!
如下修改功能
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 * FROM類別將給出以下結果。
1 BMW CAT-2016-10-000001
2 JAGUAR CAT-2016-10-000002
3 BMW1 CAT-2016-10-000003
4 BMW13 CAT-2016-10-000004
嘗試這個:
要初始化新字段:
ALTER TABLE category DROP COLUMN category_no;
ALTER TABLE category ADD category_no CHAR(20)
UPDATE category set category_no = dbo.generate_category_no()
對於其他插入:
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
但是您可以嘗試使用SEQUENCE
功能,該功能在Sql Server 2012版之前可用
關於SEQUENCE
您可以在這里看到
您函數中最大的缺陷是它不適用於批量插入的
由於您具有自動生成的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
最后,我解決了這個問題。 我的功能如下所示:
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 |
+---+--------------------+--------------+
謝謝大家的幫助。 謝謝!!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.