系统单据号生成存储过程

CREATE PROCEDURE [dbo].[GeneralDocumentNoByBatch]
    @preFix nvarchar(256),@GenNum int ,@outCode varchar(256) output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    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‘‘[email protected];
    if(LEN(@day)=1) set @day=‘‘0‘‘[email protected];
    -- WITH(XLOCK,PAGLOCK)    
    set @docNo = @preFix+cast(YEAR(getdate()) as varchar)+ @[email protected];    
    if @preFix=‘‘WV‘‘ or @preFix=‘‘SR‘‘ or @preFix=‘‘SA‘‘
    set @sql =N‘‘select top 1 @p=code from ‘‘[email protected] +‘‘ WITH(holdlock,tablockx) where CHARINDEX(‘‘‘‘‘‘[email protected]+‘‘‘‘‘‘,code)=1 order by id desc‘‘;    
    else
    set @sql =N‘‘select top 1 @p=code from ‘‘[email protected] +‘‘ WITH(holdlock,tablockx) where CHARINDEX(‘‘‘‘‘‘[email protected]+‘‘‘‘‘‘,code)=1 order by id desc‘‘;    
    EXEC sp_executesql @sql,N‘‘@p varchar(256) output‘‘,@[email protected] output ;
    if(@maxCode is null)
    begin
        set @no=‘‘0001‘‘;    
    end;
    else
    begin
        if @preFix=‘‘WV‘‘ or @preFix=‘‘SR‘‘ or @preFix=‘‘SA‘‘
            set @no=CAST((CAST(SUBSTRING(@maxCode,len(@preFix)+1,LEN(@maxCode)) as int)) as varchar);
        else
        set @no=CAST((CAST(SUBSTRING(@maxCode,len(@docNo)+1,LEN(@maxCode)) as int)) as varchar);        
    end;
    --print @no
    declare @tmptable table(preFix varchar(20),Code varchar(50))
    --设定流水号位数
    set @num =4;
    declare @i int
    set @i=0
    while @i<@GenNum
    begin
    set @no=cast(cast(@no as int)+1 as varchar(10))
        set @lennum = LEN(@no);
        --print @lennum
        while @lenNum<@num
        begin
            set @[email protected]+1;
            set @no=‘‘0‘‘[email protected];    
        end        
    
    set @[email protected]+1
    if @preFix=‘‘WV‘‘  or @preFix=‘‘SR‘‘ or @preFix=‘‘SA‘‘
    insert into @tmptable select @preFix,@[email protected]
    else
    insert into @tmptable select @preFix,@[email protected]
    end;
    
    insert into documentno (Prefix,Code) select Prefix,Code from @tmptable ;
    --select @[email protected];
    --返回最大的流水号    
    if @preFix=‘‘WV‘‘
    set @outCode=‘‘W‘‘[email protected];
    else
    set @[email protected][email protected];
    --select Prefix,Code from @tmptable
END

CREATE PROCEDURE [dbo].[GeneralDocumentNo]
    @preFix nvarchar(256),@outCode varchar(256) output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    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‘‘[email protected];
    if(LEN(@day)=1) set @day=‘‘0‘‘[email protected];
    
    set @docNo = @preFix+cast(YEAR(getdate()) as varchar)+ @[email protected];    
    if @preFix=‘‘WV‘‘
    set @sql =N‘‘select top 1 @p=code from ‘‘[email protected] +‘‘ WITH(holdlock,tablockx) where CHARINDEX(‘‘‘‘‘‘[email protected]+‘‘‘‘‘‘,code)=1 order by id desc‘‘;    
    else
    set @sql =N‘‘select top 1 @p=code from ‘‘[email protected] +‘‘ WITH(holdlock,tablockx) where CHARINDEX(‘‘‘‘‘‘[email protected]+‘‘‘‘‘‘,code)=1 order by id desc‘‘;    
    EXEC sp_executesql @sql,N‘‘@p varchar(256) output‘‘,@[email protected] output ;
    if(@maxCode is null)
    begin
        set @no=‘‘0001‘‘;    
    end;
    else
    begin
        if @preFix=‘‘WV‘‘
            set @no=CAST((CAST(SUBSTRING(@maxCode,len(@preFix)+1,LEN(@maxCode)) as int)+1) as varchar);
        else
            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 @[email protected]+1;
    set @no=‘‘0‘‘[email protected];
    end
    if @preFix=‘‘WV‘‘
    begin
    insert into documentno(Prefix,Code) values(@preFix,@[email protected]);
    set @outCode=‘‘W‘‘[email protected];
    end
    else
    begin
    insert into documentno(Prefix,Code) values(@preFix,@[email protected]);
    --select @[email protected];    
    set @[email protected][email protected];
    end
END

原文地址:https://www.cnblogs.com/lionking/p/11619892.html

时间: 2024-11-09 00:43:07

系统单据号生成存储过程的相关文章

基于mysql的单据号生成(前缀+日期+自增id+后缀)

介绍 本次采用mysql处理,性能不是很好,对于高并发有要求的建议不要采用公司一个小项目,需要生成一个单据号,格式为: 日期 + 每日重新自增号,自己考虑了一下每日自增需要考虑并发和持久问题,两种数据库redis和mysql由于项目较小,所以没有redis因为这个增加一个redis好像有点不值得,所以采用mysql作为持久化处理,一下思路也是借鉴了网上的许多想法 源码 源码查看规则源码位置: blog-study:module-utils:work-no 欢迎大家随时批评指正 思路 首先根据需求

分布式系统中的必备良药 —— 全局唯一单据号生成

阅读目录 单据号是指什么 和唯一ID的不同是什么 为什么需要全局唯一单据号生成程序 实现的方式有哪些 笔者推荐的方式 结语 一.单据号是指什么 我们作为一个软件系统,肯定到处充满着各种单据,也必然需要有各种单据号与之对应.比如:电商行业的订单号.支付流水号.退款单号等等.SCM的采购单号.进货单号.出货单号.盘点单号等.在一个企业内部或者一个2C的平台,无法避免的需要通过某个单据号来进行沟通.所以一个好的单据号必然是便于沟通的,简单来说优先级就是 好记 > 好输入 > 好看,当然也是越短越好.

SqlServer 可更新订阅中在订阅库并发获取最大单据号测试及解决法案!

说明: 很多交易的系统都需要单据号,而单据号按顺序并发获取又是一件头疼的事!~ 一般单据号格式为:前缀+日期+编号(如:KK20150501000001) 现在模拟测试,数据库中的单据号作为一张表处理. 数据库单据号表(Billnumber)存储每个账号及其最大的单据号总共一条记录 单据号是组合而成的字符串,后6位为序号. 获取单据号的存储过程: EXEC [dbo].[GetBillnumber_Test]@Account='Account',@Billnumber NVARCHAR(20)O

用SQL存储过程生成唯一单据号

在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如销售单据号,盘点单据号,进货单据号等),利用数据库锁的原理,先看一下SQL语句: CREATE PROC [dbo].[getlsh]     @lx VARCHAR(6) ,     @lsh VARCHAR(30) OUTPUT AS     BEGIN  --启动事务处理         [email protected]_poin

.Net常用技巧_生成单据号

自己用的,没整理,代码比较乱,请不要学我. using System; using System.Collections.Generic; using System.Text; using EXDataControl; using System.Data; using System.Data.SqlClient; using Utility; namespace MyTool { public class CreateDocNo { /// <summary> /// 获取单号 /// <

解析大型.NET ERP系统 单据编码功能实现

单据编码是ERP系统中必备的功能,用于生成各种单据的流水号,常常借助于日期时间等字符来生成一个唯一的单据号码.从软件的角度来说,就是为生成数据表的主键值(参考编号),从用户的角度来说,就是给业务单据制定编码规范.之后做到见名知意,比如销售订单号是SO201508190001,采购订单号码是PO201508190001. 1 基础单据编码 Document serialization basic 单据编码主表,用于存放单据及其编码规则. CREATE TABLE [dbo].[DocumentSe

shell脚本,批量创建10个系统帐号并设置密码为随机8位字符串。

[[email protected] wyb]# cat user10.sh #!/bin/bash #批量创建10个系统帐号wangyb01-wangyb10并设置密码(密码为随机8位字符串). >user.list for user in `seq -w 10` do useradd wangyb$user password=`echo $RANDOM|md5sum|cut -c 1-8` echo $password|passwd wangyb$user --stdin echo wang

银行转账存储过程和流水号生成存储过程

银行转账存储过程 USE [BankInfor] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Transfer](@inAccount int,@outAccount int,@amount float) as declare @totalDeposit float; begin select @totalDeposit=total from Account where [email pro

系统改变号(SCN)的详解

oracle026 系统改变号(SCN)的详解 SCN 系统改变号,是通过某些函数把时间产生某个数:确保数据文件的一致性,比较先后,新旧: 为什么使用时间产生数字,因为在比较时间的比较慢,而用数字就相对的块点,就像shared pool 比较sql的 使用算出的hash值进行比较. select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) fr