MSSQL 生成編號 --整理帖

本文介绍了一种使用SQL函数和过程来生成唯一编号的方法,包括基于日期的流水号和通过编号表实现的不同类型业务单据的流水号生成。该方案利用T-SQL语言特性实现了高效的自动编号机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

if object_id('tb','U')is not null drop table tb

if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[f_GetBH]')and xtype in(N'FN', N'IF', N'TF'))

drop function [dbo].[f_GetBH]

GO

create function f_GetBH()

returns varchar(8)

as

  begin

     return(select right(1000001+isnull(right(max(BH),6),0),6) from tb with (xlock,paglock) )

  end

go

--建表

create table tb(BH varchar(8) primary key default dbo.f_GetBH(),ID int)

insert tb(ID) select 1

insert tb(ID) select 2

insert tb(ID) select 3

delete tb where id=2

insert tb(ID) select 4

select * from tb

/*

BH       ID

-------- -----------

000001   1

000003   3

000004   4

 

*/

 

-->Title:得到日期编号的函数

-->Author:wufeng4552

-->Date :2009-10-20 

if object_id('tb','U')is not null drop table tb

if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[f_GetRQBH]')and xtype in(N'FN', N'IF', N'TF'))

drop function [dbo].[f_GetRQBH]

GO

create function f_GetRQBH()

returns varchar(10)

as

  begin

     declare @dt varchar(6)

     select @dt=convert(varchar(6),getdate(),12)

     return

    (select @dt+right(1000001+isnull(right(max(BH),3),0),3) from tb with (xlock,paglock) where bh like @dt +'%')

  end

go

--建表

create table tb(BH varchar(10) primary key default dbo.f_GetRQBH(),ID int)

insert tb(ID) select 1

insert tb(ID) select 2

insert tb(ID) select 3

delete tb where id=2

insert tb(ID) select 4

select * from tb

/*

BH         ID

---------- -----------

091020001  1

091020003  3

091020004  4

*/

-->Title:使用编号表生成流水号

-->Author:wufeng4552

-->Date :2009-10-20 

IF OBJECT_ID('TB_NO','U')IS NOT NULL DROP TABLE TB_NO

GO

CREATE TABLE tb_NO(

Name char(2) PRIMARY KEY,               --编号种类的名称

Head nvarchar(10) NOT NULL DEFAULT '',  --编号的前缀

CurrentNo int NOT NULL DEFAULT 0,       --当前编号

BHLen int NOT NULL DEFAULT 6,           --编号数字部分长度

DESCRIPTION NVARCHAR(50))               --编号种类说明

INSERT tb_NO SELECT 'CG','CG',0,4,N'采购订单'

UNION  ALL   SELECT 'CJ','CJ',0,4,N'采购进货'

UNION  ALL   SELECT 'JC','JC',0,4,N'进仓单'

UNION  ALL   SELECT 'ZC','ZC',0,4,N'转仓单'

UNION  ALL   SELECT 'CC','CC',0,4,N'出仓单'

GO

IF OBJECT_ID('P_NEXTBH','P')IS NOT NULL DROP PROC P_NEXTBH

GO

CREATE PROC p_NextBH

@Name char(2),           --编号种类

@BH nvarchar(20) OUTPUT  --新编号

AS

BEGIN TRAN

    UPDATE tb_NO WITH(ROWLOCK) SET 

        @BH=Head+RIGHT(POWER(10,BHLen)+CurrentNo+1,BHLen),

        CurrentNo=CurrentNo+1

    WHERE Name=@Name

COMMIT TRAN

GO

--获取 CJ 的新编号

DECLARE @bh char(6)

EXEC p_NextBH 'CJ',@bh OUT

SELECT @bh

/*

------

CJ0001

*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值