用SQLServer 存储过程实现自动生成订单号
订单号格式如下:201006110001(年+月+日+四位流水号)总共12位
如果今天是第一张单:那就是:201006110001,如果是第二张单,那单号是:201006110002,第三张单号是:201006110003
如果是明天的话:第一张单:那就是:201006120001,如果是第二张单,那单号是:201006120002,第三张单号是:201006120003
用存储过程实现,过程名字为:Order_Pro ,无参数
数据表名字为 Order 字段有:ID(自动增量为1),Order_No(单号)
我是新手,希望大家写的详细些
订单号格式如下:201006110001(年+月+日+四位流水号)总共12位
如果今天是第一张单:那就是:201006110001,如果是第二张单,那单号是:201006110002,第三张单号是:201006110003
如果是明天的话:第一张单:那就是:201006120001,如果是第二张单,那单号是:201006120002,第三张单号是:201006120003
用存储过程实现,过程名字为:Order_Pro ,无参数
数据表名字为 Order 字段有:ID(自动增量为1),Order_No(单号)
我是新手,希望大家写的详细些
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/
数据库里有编号字段
BH00001
BH00002
BH00003
BH00004
如何实现自动增长 --下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/ create table tb
(id int identity,
name varchar(10),
code as 'BH'+right('0000'+cast(id as varchar),5))
go
insert tb(name) select 'A'
union all select 'B'
union all select 'C'
union all select 'D'select * from tbdrop table tb/*
id name code
----------- ---------- ------------
1 A BH00001
2 B BH00002
3 C BH00003
4 D BH00004(所影响的行数为 4 行)
*/
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/
--建立
Create Proc GetOrderNo
AS
declare @MaxOrder_No varchar(12)
select @MaxOrder_No=MAX(Order_No) from [Order] where left(Order_No,8)=convert(varchar(20),GETDATE(),112)
select convert(varchar(20),GETDATE(),112)+REPLACE(STR(convert(int,substring(@MaxOrder_No,9,4))+1,4),' ','0') AS Order_No--执行
exec GetOrderNo
ID PID
1 0911200001 当天时间091120+0001
2 0911200002 当天时间091120+0002
依次类推
0911210001 第二天又是取当前时间+0001
0911210002 第二天又是取当前时间+0002
依次类推
0911220001 第二天又是取当前时间+0001
.......
这个要怎么实现哦!!!帮帮忙(ID不用管,只求那个编号)
-------------------create table tb(ID int IDENTITY,PID varchar(20), PID2 varchar(20))
gocreate trigger my_trig on tb FOR INSERT
as
begin
declare @cnt as int
select @cnt = count(1) from tb where pid = (select pid from inserted)
update tb set pid2 = pid + right('0000'+cast(@cnt as varchar),4) where id = (select id from inserted)
end
goinsert into tb(pid) values('091120')
insert into tb(pid) values('091120')
insert into tb(pid) values('091121')
insert into tb(pid) values('091121')select * from tbdrop table tb/*ID PID PID2
----------- -------------------- --------------------
1 091120 0911200001
2 091120 0911200002
3 091121 0911210001
4 091121 0911210002(所影响的行数为 4 行)
*/
create table tb(Order_No varchar(12))
go-- 建存储过程
create proc GenNewOrderNo
(@neworderno varchar(12) output)
as
begin
if exists(select Order_No from tb where left(Order_No,8) = convert(varchar(8),getdate(),112))
select top 1 @neworderno = left(Order_No,8) + right('0000' + cast((cast(right(Order_No,4) as int)) + 1 as varchar(4)),4) from tb where left(Order_No,8) = convert(varchar(8),getdate(),112) order by Order_No desc
else
select @neworderno = convert(varchar(8),getdate(),112)+'0001'
end
-- 表内无当天数据时
declare @neworderno varchar(12)
exec GenNewOrderNo @neworderno output
select @neworderno
/*
------------
201006130001(1 行受影响)
*/-- 表内插入三条数据后,得到
insert into tb select '201006130001'
union all select '201006130002'
union all select '201006130003'
go
declare @neworderno varchar(12)
exec GenNewOrderNo @neworderno output
select @neworderno
/*
------------
201006130004(1 行受影响)
*/