利用SQL表生成按日期序列的唯一ID

1. 创建一个表,用于存现在最大的ID

SELECT [ID],[PreFix],[Code] FROM [DocumentNO]

2. 增加SP,利用锁表,生成相应的ID

Create PROCEDURE [dbo].[GeneralDocumentNo]
(
 @preFix nvarchar(256),
 @outCode varchar(256) output
)
AS
BEGIN
-- =============================================
-- Author:  xiefs
-- Create date: 2013-12-18
-- Description: 生成系统唯一序列号
-- =============================================
Declare @docNo nvarchar(256),
        @month varchar(10),
        @day varchar(10),
        @no varchar(10),
        @num int ,
        @lenNum int,
        @sql nvarchar(4000),
        @maxCode varchar(256),
        @tableName varchar(256)

 SET NOCOUNT ON;
 set @tableName=‘DocumentNo‘;
 set @month=CAST(month(getdate())as varchar);
 set @day = CAST(day(getdate())as varchar);
 if(LEN(@month)=1) set @month=‘0‘+@month;
 if(LEN(@day)=1) set @day=‘0‘+@day;

 set @docNo = @preFix+cast(YEAR(getdate()) as varchar)+ @month+@day;
 set @sql =N‘select top 1 @p=code from ‘+@tableName +‘ WITH(holdlock,tablockx) where CHARINDEX(‘‘‘+@docNo+‘‘‘,code)=1 order by id desc‘;
 EXEC sp_executesql @sql,N‘@p varchar(256) output‘,@p=@maxCode output ;
 if(@maxCode is null)
 begin
  set @no=‘1‘;
 end;
 else
 begin
  set @no=CAST((CAST(SUBSTRING(@maxCode,len(@docNo)+1,LEN(@maxCode)) as int)+1) as varchar);
 end;

 set @lennum = LEN(@no);
 set @num =4;
 while @lenNum<4
 begin
 set @lenNum=@lenNum+1;
 set @no=‘0‘+@no;
 end
 insert into documentno(Prefix,Code) values(@preFix,@docNo+@no);
 --select @[email protected];
 set @outCode=@docNo+@no;
END
时间: 2024-08-10 23:15:42

利用SQL表生成按日期序列的唯一ID的相关文章

sql server 生成连续日期

在sqlserver里,可以利用系统表master..spt_values里面存储的连续数字0到2047,结合dateadd()函数生成连续的日期. SELECT CONVERT (VARCHAR (10),dateadd(d, number, '2019-05-30'),23) AS rq FROM master..spt_values WHERE type = 'p' AND number between 1 and 2049 参考博客:https://blog.csdn.net/qq_25

oracle中利用旧表生成新表

数据库中原有表CCC,字段如图 create table CCCAAABBB as select *from CCC where 1=2 上面用1=2代表只是复制原有表的表结构 若: 就是除了表的名字不同,table结构与字段均相同

分布式系统唯一ID生成方案汇总

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见的ID生成策略. 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理. 2)在单个数据库或

分布式全局唯一ID生成策略?

一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. 1.1 唯一ID的特性 整个系统ID唯一; ID是数字类型,而且是趋势递增; ID简短,查询效率快. 1.2 递增与趋势递增 递增 趋势递增 第一次生成的ID为12,下一次生成的ID是13,再下一次生成的ID是14. 什么是?如:在一段时间内,生成的ID是递增的趋势.如:再一段时间内生成的ID在[

SQL 生成一个日期范围

有时想按日或月生成一个序列,就像2014-1-1.2014-1-2.2014-1-3... 在sql server中可以写个函数来实现. /* 生成一个日期范围,如2014.01.2014.02... @Increment 步进值 @StartDate 开始日期 @EndDate 结束日期 ---------------------- @SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中) 返回表的字段和类型: iDate DATETIME, iYear cha

利用&quot;SQL&quot;语句自动生成序号的两种方式

1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[name] from sysobjects ◆运行的结果: rowid   name 1           all_columns 2           all_objects 3           all_parameters 4           all_sql_modules 5          

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

在线数据库表(sql语句)生成java实体类工具 - 参考手册

SQL建表语句 说明 格式良好的SQL建表语句,可以是直接从PowerDesigner.Navicat等工具中导出SQL建表语句.所谓格式良好,是指建表指令与表名必须在一行,字段名称.类型.注释必须在一行,因为这个工具是用正则实现的,并不是语法解析器,当然,以后有时间的话,会改进成解析器. 举例 -- ---------------------------- -- Table structure for t_activity -- ---------------------------- DRO

Tsql生成序列、日期序列

--方法1 SET NOCOUNT ON USE tempdb GO IF OBJECT_ID('dbo.nums')IS NOT NULL DROP TABLE dbo.nums; GO CREATE TABLE dbo.nums(n INT NOT NULL PRIMARY KEY); DECLARE @max AS INT,@rc AS INT SET @max=1000000 SET @rc=1 INSERT INTO nums VALUES (1); WHILE @rc*2<=@max