【发布时间】:2017-03-03 16:55:46
【问题描述】:
我正在使用 Microsoft SQL Server 2014。在我们的要求中,包含自定义格式的序列号。
序列号格式为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,就OK了。它显示没有错误。但是当我运行以下命令时:
SELECT * FROM category;
它显示以下错误:
消息 217,第 16 级,状态 1,第 1 行
超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。
我不知道如何解决这个问题。甚至我不知道我的功能是否有效。我从互联网上引用了这个功能。
添加
我需要为每个月重置序列号。例如。下个月,no 应该如下:
CAT-2016-11-000001
请赐教。提前致谢!
【问题讨论】:
-
如果两个会话同时运行(SELECT MAX(category_no) FROM category)怎么办?谁获得 +1 值?
-
您在从表中选择数据、执行函数或创建函数时遇到错误?是否有任何与 table 关联的触发器?
-
不,db 中没有触发器。只有这个功能。
-
这里发生了无限循环,因此 SQL Server 引擎通过将嵌套级别的最大值设置为 32 来防止这种情况发生。无限循环是通过调用 select * from category 调用你的函数来发生的从同一张桌子..等等。如果您从 1= 2 的类别中选择 *,则没有错误,也没有数据:),但是在选择数据时,会发生无限循环。
-
不,当我运行 sql
Select id, category_name, category_no From category Where id < 3;时,它显示了同样的错误。
标签: sql sql-server function procedure