简体   繁体   English

SQL Server:自动生成的自定义格式序列号

[英]SQL Server: auto-generated custom format sequence number

I am working with Microsoft SQL Server 2014. In our requirement, custom formatted sequence number is include. 我正在使用Microsoft SQL Server2014。在我们的要求中,包括自定义格式的序列号。

The sequence number format is CAT-YYYY-MM-NNNNNN . 序列号格式为CAT-YYYY-MM-NNNNNN Sample data: 样本数据:

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

I don't want to use GUID or any other and I want to work with a procedure or function. 我不想使用GUID或其他任何东西,而是想使用一个过程或函数。

So, I am trying with this: 所以,我正在尝试:

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');

When I run the above SQL in step-by-step, it is OK. 当我逐步运行上述SQL时,就可以了。 It shown no error. 它没有显示错误。 But when I run the following command: 但是当我运行以下命令时:

SELECT * FROM category;

it shows the following error: 它显示以下错误:

Msg 217, Level 16, State 1, Line 1 消息217,第16级,状态1,第1行
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). 超出最大存储过程,函数,触发器或视图嵌套级别(限制32)。

I don't know how to solve this one. 我不知道如何解决这个问题。 And even I don't know my function has worked or not. 甚至我都不知道我的功能是否起作用。 I referenced from internet for this function. 我从互联网上引用了此功能。

ADDED 添加

I need to reset sequence no for every month. 我需要每月重新设置序列号。 Eg. 例如。 for next month, no should be as follow: 下个月的否应为:

CAT-2016-11-000001

Please, enlighten me. 拜托,请赐教。 Thanks in advance! 提前致谢!

Modify your function as below 如下修改功能

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 category will give the below result. 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  

Try this: 尝试这个:

To initialize your new field: 要初始化新字段:

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

UPDATE category set category_no = dbo.generate_category_no()

For other insert: 对于其他插入:

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

But you can try to use SEQUENCE feature, available on Sql Server by 2012 version 但是您可以尝试使用SEQUENCE功能,该功能在Sql Server 2012版之前可用

About SEQUENCE you can see here 关于SEQUENCE您可以在这里看到

Biggest flaw in your function is it will not work for Batch Insert's 您函数中最大的缺陷是它不适用于批量插入的

Since you have ID auto generated, here is a easier way to do this 由于您具有自动生成的ID ,因此这是一种更简单的方法

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

Demo 演示版

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') 

Result : 结果:

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

Finally, I solved the problem. 最后,我解决了这个问题。 My Function look like as follow: 我的功能如下所示:

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

And I insert data as follow: 插入数据如下:

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');

One things is that We can call function from INSERT query . 一件事是, 我们可以从INSERT查询中调用函数

So, when I run the following sql: 因此,当我运行以下sql时:

SELECT * FROM category;

It give the result as shown in below. 结果如下图所示。

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

Thanks everybody for helping me. 谢谢大家的帮助。 Thanks!!! 谢谢!!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM