生成唯一编号(序列号)--sql存储过程
CREATE procedure [dbo].[P_Sys_GetSerialNo] --取业务序列号
@SeqType int, --序列号类别,4位数,如:10+2+1 即1021
@GetCount int=1 , --要取的编号数
@IDList varchar(8000) out, --返回的序号列表
@ErrNum int=0 out, --执行错误号
@ErrMsg varchar(200) out --错误信息
as
declare
@tableNameA varchar(50),
@FieldNameA varchar(50),
@liCurrID int,
@liLength int,
@liCount int,
@liCurrLength int,
@lsID varchar(50),
@lsTmp varchar(20) set @IDList=''
set @ErrNum=0
if @SeqType<1000 or @SeqType>=10000
begin
set @ErrNum=1
set @ErrMsg='参数@SeqType的值不正确,必须为四位数的整数!'
return
end if @GetCount<1 or @GetCount>100
begin
set @ErrNum=1
set @ErrMsg='参数@GetCount必须是大于0且小等于100的数字!'
return
end set @tableNameA=Upper('GetSerialNo_'+Ltrim(Str(@SeqType)));
set @FieldNameA=convert(varchar(10),getdate(),112)
set @FieldNameA=RIGHT(@FieldNameA,6) --目的:允许重复读,以降低两个连接同时读相同的值,造成流水号重复的可能性。
BEGIN tran
select @liCurrID=isnull(nCount,0),@liLength=isnull(nLengthd,6)
from TAB_AutoNumber WITH(updlock)
where vcTableName=@tableNameA and vcFieldName=@FieldNameA IF @@rowcount=0
BEGIN
SET @liCurrID=ISNULL(@liCurrID,0)
SET @liLength=ISNULL(@liLength,6) insert into TAB_AutoNumber(vcTableName,vcFieldName,vcPrefixs,vcSuffixs,nCount,nLengthd)
values(@tableNameA,@FieldNameA,'','',1,6)
select @liCurrID=1,@liLength=6
END update TAB_AutoNumber set nCount=@liCurrID+@GetCount
where vcTableName=@tableNameA and vcFieldName=@FieldNameA
COMMIT tran if @@error<>0
begin
set @ErrNum=2
set @ErrMsg='更新最大编号出错!'
return
END
/*
begin tran
if exists(select vcTableName from TAB_AutoNumber with(nolock) where vcTableName=@tableNameA and vcFieldName=@FieldNameA)
begin
select @liCurrID=isnull(nCount,0),@liLength=isnull(nLengthd,6)
from TAB_AutoNumber with(updlock) where vcTableName=@tableNameA and vcFieldName=@FieldNameA
end else
begin
insert into TAB_AutoNumber(vcTableName,vcFieldName,vcPrefixs,vcSuffixs,nCount,nLengthd)
values(@tableNameA,@FieldNameA,'','',1,6)
select @liCurrID=1,@liLength=6
end
update TAB_AutoNumber set nCount=@liCurrID+@GetCount
where vcTableName=@tableNameA and vcFieldName=@FieldNameA
if @@error<>0
begin
set @ErrNum=2
set @ErrMsg='更新最大编号出错!'
return
end
commit tran
*/
set @IDList=''
set @liCount=@liCurrID
while @liCount<@liCurrID+@GetCount
begin
set @lsID=Ltrim(Str(@liCount))
begin
set @liCurrLength=Len(@lsID)
if @liCurrLength<@liLength
set @lsTmp=Replicate('',@liLength-@liCurrLength)
else
set @lsTmp=''
--set @lsTmp='9'+RIGHT(@lsTmp,LEN(@lsTmp)-1)
set @IDList=@IDList+','+@FieldNameA+Ltrim(Str(@SeqType))+@lsTmp+@lsID
end
set @liCount=@liCount+1
end
set @IDList=Substring(@IDList,2,len(@IDList)-1) ---示范
--Declare @vcShoppingCartCNO varchar(30)
--Declare @ErrNum varchar(30)
--Declare @ErrMsg varchar(30)
----- 1001 用户注册
----- 1002 订单类
----- 1003 财务类
--exec P_Sys_GetSerialNo 1001,1,@vcShoppingCartCNO OUT,@ErrNum OUT,@ErrMsg OUT
--print @vcShoppingCartCNO
-- --
-- select * from tab_AutoNumber
-- delete tab_AutoNumber ----------------------------------------------------------------------------------------- CREATE PROC [dbo].[P_Sys_GetSerialNoBy]
@ntype int,
@SerialNo varchar(20) out
as
BEGIN
Declare @vcShoppingCartCNO varchar(30)
Declare @ErrNum varchar(30)
Declare @ErrMsg varchar(30)
--- 1001 用户类
--- 1002 企业类
--- 1003 财务类
--- 1004 简历
--- 1005 职位
--- 1006 其他
exec P_Sys_GetSerialNo @ntype,1,@vcShoppingCartCNO OUT,@ErrNum OUT,@ErrMsg OUT
set @SerialNo=@vcShoppingCartCNO END --Declare @vcShoppingCartCNO varchar(30)
--Declare @ErrNum varchar(30)
--Declare @ErrMsg varchar(30)
----- 1001 用户注册
----- 1002 订单类
----- 1003 财务类
--exec P_Sys_GetSerialNo 1001,1,@vcShoppingCartCNO OUT,@ErrNum OUT,@ErrMsg OUT
--print @vcShoppingCartCNO ------------------------------------------------------------------------------------
/**创建表**/
if exists (select * from sysobjects where id = OBJECT_ID('[tab_AutoNumber]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [tab_AutoNumber] CREATE TABLE [tab_AutoNumber] (
[vcTableName] [varchar] (50) NOT NULL,
[vcFieldName] [varchar] (20) NOT NULL,
[vcPrefixs] [varchar] (20) NULL,
[vcSuffixs] [varchar] (20) NULL,
[nLengthd] [smallint] NULL,
[nCount] [int] NOT NULL,
[vcMemos] [varchar] (50) NULL) ALTER TABLE [tab_AutoNumber] WITH NOCHECK ADD CONSTRAINT [PK_tab_AutoNumber] PRIMARY KEY NONCLUSTERED ( [vcTableName],[vcFieldName] ) ------------------------------------------------------------------------------------
/**执行**/
DECLARE @strNumberKey VARCHAR(20)
EXEC P_Sys_GetSerialNoBy '',@strNumberKey out
生成唯一编号(序列号)--sql存储过程的更多相关文章
- SQlSERVER生成唯一编号
基数表-用来存储编号前缀和类型 建表如下 CREATE TABLE [dbo].[SerialNo]( [sCode] [varchar](50) NOT NULL, [sName] [varchar ...
- PHP实现生成唯一编号(36进制的不重复编号)
当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号. 我们将0-Z(012345678 ...
- c#生成唯一编号方法记录,可用数据库主键 唯一+有序
数据库主键目前主要有两种: a.自增数值型 优:占用空间小,插入快,有序对索引友好,易懂 缺:多数据库迁移会有重复键值问题,有可能爆表 b.GUID 优:多数据库唯一 缺:占用空间大,无序对索引不友好 ...
- Mysql表中唯一编号的分配机制
最近遇到一个问题:高并发环境下,如何避免MYSQL一张表里的某些列不要重复. 同其他博友一样 https://blog.csdn.net/jacketinsysu/article/details/51 ...
- 用SQL存储过程生成唯一单据号
用SQL存储过程生成唯一单据号 在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如 ...
- SQL存储过程生成顺序编码
一.第一种方式 USE [WJKC]GO/****** Object: StoredProcedure [dbo].[Address_GetCode1] Script Date: 2016/3 ...
- SQL 存储过程生成
use workflow; GO /****** 对象: StoredProcedure [dbo].[pro_GenerateProGet] 脚本日期: 08/03/2012 11:26:43 ** ...
- java生成唯一的id编号
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- 【SQL-自动生成编号】按规则自动生成单据编号 以及并发问题_使用触发器、函数 等
描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否 ...
随机推荐
- 细说C#多线程那些事-线程基础
我第一次接触“线程”的概念时,觉得它深奥难懂,看了好多本书,花了很长时间才领悟到它的真谛.现在我就以一个初学者的心态,把我所理解的“多线程”描述给大家.这一次是系列文章,比较完整的展示与线程相关的基本 ...
- [设计模式] javascript 之 适配器模式
适配器模式说明 说明: 适配器模式,一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况: 场景: 就好比我们买了台手机,买回来后发现,充电线插头是三插头,但家里,只有两插 ...
- Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs
目录 前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set(name,value) app.use ...
- Linux中使用crontab命令定时执行shell脚本或其他Linux命令
使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行 如何往 cron 中添加一个作业? # crontab –e0 5 * ...
- maven初学(二)archeType插件使用
archeType是一个maven插件,它的主要功能是根据模板来创建工程结构 创建工程结构: 1,创建工程目录 2,输入命令:mvn archetype:generate 3,选择需要的archety ...
- 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元
如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...
- 【ZOJ 3870】 Team Formation
题意 n个数,找出有几对a.b 符合 a ^ b > max(a,b) .^表示异或号 分析 对于数a,如果它的二进制是: 1 0 1 0 0 1,那么和它 ^ 后 能比他大的数就是: 0 1 ...
- BZOJ-3282 Tree Link-Cut-Tree(似乎树链剖分亦可)
蛋蛋用链剖A的,我写的LCT 3282: Tree Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1241 Solved: 542 [Submit][ ...
- Codevs2157 配对
题目描述 Description 给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A.B中各选出n个元素进行一一配对(可以不按照原来在序列中的顺序), ...
- C/C++代码中的笔误
1. 在printf()的参数前加& (2015/10/7) 这是我写的一个数据生成器(generator)片段 +; printf("%d\n", &n);