簡體   English   中英

SQL Server:自動生成的自定義格式序列號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM