sql产生流水号

一个产生流水号(年月日+5位流水号)的存储过程

现在客户有一个需求,要产生一个流水号,如090611+000001(年月日+五位流水号),此流水号在数据库表中是主键,且为varchar类 型。如果在当天之内插入此流水号,则此流水号递增,即:090611000001,090611000002,090611000003,如果不是在当天 时间,必须从090612000001开始递增。我写了个存储过程实现它。

create procedure test_proc
  @id nvarchar(13) output
as

begin
  set nocount on
  declare @date nvarchar(8),
          @maxdj_no numeric(13,0)
  select  @date  = convert(nvarchar(20),getdate(),112) , @maxdj_no = convert(numeric(13,0),max(id)) from XT_DJNO
  if substring(convert(char(20),@maxdj_no),1,6) = substring(@date,3,8)  --如果当日已经产生单据编号
       begin
         select @id = convert(nvarchar(13),@maxdj_no+1)
--print(@maxdj_no+1)
       insert into XT_DJNO values(substring(@id,3,13),substring(convert(char(20),@maxdj_no),1,6))
  --print(substring(convert(char(20),@maxdj_no),1,6))
       return
     end
  else
     begin
  set @date=substring(@date,3,8)
       set @id =  @date + '00001'
       insert into XT_DJNO values(@id,convert(nvarchar(13),@maxdj_no))
  --print(substring(@date,3,8))
       return
     end
end

 

ORACLE中生成流水号 创建一个序列:
  create sequence EXAMPLE_SEQ
  increment by 1
  start with 1
  minvalue 1
  cache 20;
  在EXAMPLE表上创建一个触发器
  CREATE OR REPLACE TRIGGER "PORTAL".TRI_EXAMPLE_TABLE BEFORE INSERT ON EXAMPLE_TABLE FOR EACH ROW
  begin
   select to_char(sysdate,'YYYYMMDD')||to_char(EXAMPLE_SEQ.nextval,'0000') into :new.EXAMPLE_ID from dual;
  end;

 

 

首先在数据库中创建一个存放流水号的表

CREATETABLE[dbo].[NumSeq] (
[Cate][varchar] (2)  NOTNULL ,
[DateNo][varchar] (4)  NOTNULL ,
[Seq][int]NULL ,
[CrTime][datetime]NOTNULL
)

  上面的代码中,Cate 字段为流水号的头,可以在下面的存储过程中用参数的方式传入,我的定义是2个字符,这个可以根据具体需要更改
  DateNo 字段为获取日期信息
  Seq 字段为流水号,但最终生成的流水号是这三个字段的相加

  创建存储过程

CREATEPROC dpPMT_SGetMaintainSeq
@MaintainCateVARCHAR(2)
AS--***********************累加编号*************************************************DECLARE@MaintainNoVARCHAR(12)
IFNOTEXISTS(SELECT*FROM
NumSeq
WHERE
Cate=@MaintainCateANDDATEDIFF(DAY,CrTime,GETDATE())=0)
BEGININSERTINTO
NumSeq(Cate,DateNo,Seq)
values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0)
ENDELSEBEGINUPDATE
NumSeq
SET
Seq=Seq+1WHERE
Cate=@MaintainCateAND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))
END--************************组合编号***************************************************************SELECT@MaintainNo=Cate+DateNo+REPLICATE('0',6-LEN(Seq))+CONVERT(VARCHAR(6),Seq)
FROM
NumSeq
WHERE
Cate=@MaintainCateAND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))
SELECT@MaintainNo

  这个存储过程最终输出的结果如:AA071031000001 前面两位是传入的参数,中间四位是年份的后两位和月,最后的六位为6位数字的流水号。您也可以修改上面的存储过程来生成符合您要求的流水号

转载于:https://www.cnblogs.com/Eleanore/p/sql_%e6%b5%81%e6%b0%b4%e5%8f%b7.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 流水号脚本通常用于生成一系列连续的、唯一的编号值,这些编号值可以应用于数据表的新记录中作为标识符(例如ID)。在 SQL Server 中,这可以通过触发器或者存储过程完成。 ### 使用触发器创建流水号 **步骤 1:** 首先,确保目标表具有足够的字段来存储流水号。比如: ```sql CREATE TABLE Orders ( OrderId INT IDENTITY(1,1) PRIMARY KEY, CustomerId INT, OrderDate DATETIME, ProductId INT, Quantity INT, Price DECIMAL ); ``` `ORDERID` 字段通过 `IDENTITY(1,1)` 自动生成递增的唯一整数值。 **步骤 2:** 创建一个插入触发器来更新该字段: ```sql CREATE TRIGGER dbo.Trigger_InsertOrder ON Orders AFTER INSERT AS BEGIN UPDATE Orders SET OrderId = MAX(OrderId) + 1 FROM Orders o WHERE EXISTS (SELECT * FROM inserted i WHERE i.CustomerId = o.CustomerId AND i.OrderDate > o.OrderDate) END; ``` 这个触发器会在每次向 `Orders` 表中插入新记录时运行,并更新 `OrderId` 列,使其保持递增并避免重复。 ### 使用存储过程创建流水号 另一种方法是在应用程序端生成流水号,然后将它插入到数据库中。例如,在 SQL Server 中使用 T-SQL 创建存储过程: ```sql CREATE PROCEDURE sp_InsertNewOrder AS BEGIN DECLARE @NextOrderId INT; SELECT @NextOrderId = ISNULL(MAX(OrderId), 0) + 1 FROM Orders; -- 插入新订单 INSERT INTO Orders (CustomerId, OrderDate, ProductId, Quantity, Price) VALUES (@customerId, GETDATE(), @productId, @quantity, @price); PRINT 'New order with ID ' + CAST(@NextOrderId AS VARCHAR); END; ``` 在这个例子中,存储过程会获取当前最大 `OrderId` 的下一个数值,然后将其用于新插入的行。 ### 相关问题: 1. **如何优化 SQL Server 流水号脚本性能?** - 可以考虑使用索引来加速查询速度,尤其是在大型表上。 - 定期检查和维护数据库日志,防止性能瓶颈。 2. **在哪些场景下更适合手动设置流水号而非使用自动增长列?** - 当需要控制特定的业务流程逻辑,如按照日期分组生成流水号。 - 数据安全性需求高,需要对流水号生成有严格的控制。 3. **SQL Server 提供了哪些其他工具或功能用于管理数据表和流水号?** - SQL Server Management Studio (SSMS) 提供图形化的界面来创建触发器和存储过程。 - 使用系统存储过程,如 `sp_MSforeachtable` 来批量操作多张表。 - 考虑集成自动化工具或宏来简化流水号的生成过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值