首页 > 数据库 >sql 单号编码规则

sql 单号编码规则

时间:2023-04-03 11:45:33浏览次数:29  
标签:编码 BEGIN SET OFF -- sql datelen key 规则

--SET QUOTED_IDENTIFIER ON|OFF
--SET ANSI_NULLS ON|OFF
--GO

/*
Description:单号编码规则
@key:开头字符串
@datelen:日期长度 2:年的后两位 4:年 6:年月 8:年月日
@numlen:流水号长度  例如0:1 4:0001
@spacer: 默认空 
*/
ALTER PROC Pro_realtime_GetMaxBillNo
( @key NVARCHAR(10) = '' ,
  @datelen INT = 0 ,
  @numlen INT = 0 ,
  @spacer NVARCHAR(1) = ''
)
AS
BEGIN
      SET IMPLICIT_TRANSACTIONS OFF
      BEGIN TRAN

      IF ( @key IS NULL )
      BEGIN
            SET @key = '';
      END

      DECLARE @datestr NVARCHAR(8)
      --日期间隔
      IF ( @datelen <= 0 )
      BEGIN
            SET @datestr = '';
      END
      ELSE
            IF ( @datelen = 2 )
            BEGIN
                  SET @datestr = RIGHT(YEAR(GETDATE()), 2);
            END 
            ELSE
            BEGIN
                  SET @datestr = LEFT(CONVERT(VARCHAR(8), GETDATE(), 112),
                                      @datelen)
            END

      IF ( @spacer IS NULL )
      BEGIN
            SET @spacer = '';
      END

      IF NOT EXISTS ( SELECT    1
                      FROM      dbo.t_realtime_BillNo WITH ( TABLOCKX )
                      WHERE     FKey = @key
                                AND FDateLen = @datelen
                                AND FNumLen = @numlen
                                AND FDateStr = @datestr
                                AND FSpacer = @spacer )
      BEGIN
            INSERT  dbo.t_realtime_BillNo ( FKey, FKeyLen, FDateStr, FDateLen,
                                            FNum, FNumLen, FBillNo, FCTime,
                                            FSpacer )
            VALUES  ( @key, LEN(@key), @datestr, @datelen, 1, @numlen,
                      CONCAT(@key, CASE WHEN @key = '' THEN ''
                                        ELSE @spacer
                                   END, @datestr,
                             CASE WHEN @datestr = '' THEN ''
                                  ELSE @spacer
                             END,
                             CASE WHEN @numlen <= 0 THEN '1'
                                  ELSE STUFF(CONVERT(NVARCHAR(20), POWER(10,
                                                              @numlen) + 1), 1,
                                             1, '')
                             END), GETDATE(), @spacer )
      END
      ELSE
      BEGIN
            UPDATE  dbo.t_realtime_BillNo WITH ( TABLOCKX )
            SET     FNum+= 1,
                    FBillNo = CONCAT(FKey, CASE WHEN FKey = '' THEN ''
                                                ELSE FSpacer
                                           END, FDateStr,
                                     CASE WHEN FDateStr = '' THEN ''
                                          ELSE FSpacer
                                     END,
                                     CASE WHEN FNumLen <= 0
                                          THEN CAST(FNum + 1 AS NVARCHAR(11))
                                          ELSE STUFF(CONVERT(NVARCHAR(20), POWER(10,
                                                              FNumLen) + FNum
                                                     + 1), 1, 1, '')
                                     END)
            WHERE   FKey = @key
                    AND FDateLen = @datelen
                    AND FNumLen = @numlen
                    AND FDateStr = @datestr
                    AND FSpacer = @spacer
      END

      COMMIT TRAN;

      SELECT    FBillNo
      FROM      dbo.t_realtime_BillNo WITH ( TABLOCKX )
      WHERE     FKey = @key
                AND FDateLen = @datelen
                AND FNumLen = @numlen
                AND FDateStr = @datestr
                AND FSpacer = @spacer
END   
GO
--SET QUOTED_IDENTIFIER ON|OFF
--SET ANSI_NULLS ON|OFF
--GO

 -- drop table t_realtime_BillNo
/*    
CREATE TABLE t_realtime_BillNo
( FKey NVARCHAR(10) ,
  FKeyLen INT ,
  FDateStr NVARCHAR(8) ,
  FDateLen INT ,
  FNum INT ,
  FNumLen INT ,
  FSpacer nvarchar(1) NOT NULL DEFAULT(''),
  FBillNo NVARCHAR(30) ,
  FCTime DATETIME )
  */

-- TRUNCATE TABLE dbo.t_realtime_BillNo

  /*
  EXEC dbo.Pro_realtime_GetMaxBillNo @key = N'A01A', -- nvarchar(10)
      @datelen = 1, 
      @numlen = 2,
      @spacer=' '

SELECT * from dbo.t_realtime_BillNo                        
*/

 

标签:编码,BEGIN,SET,OFF,--,sql,datelen,key,规则
From: https://www.cnblogs.com/miaololi/p/17282638.html

相关文章

  • ORACLE PL/SQL 程序包的创建与应用
    原文地址:https://www.cnblogs.com/huyong/archive/2011/05/26/2057973.html本篇主要内容如下:第七章  程序包的创建和应用7.1  程序包简介7.2  程序包的定义7.3  包的开发步骤7.4  包定义的说明7.5  子程序重载7.6  加密实用程序7.7  删除包7.8  包的......
  • 金典 SQL笔记(2)
    因为在本地笔记上写的markdown编辑器只支持.md格式导入,图片没办法直接导进去.写的多了懒的一张一张图片切图上传;直接整个文章切成图片上传上去了. ......
  • 金典 SQL笔记(3)
    因为在本地笔记上写的.markdown编辑器只支持.md格式导入,图片没办法直接导进去.写的多了懒的一张一张图片切图上传;直接整个文章切成图片上传上去了. ......
  • Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“Schedu
    标题:MicrosoftSQLServerManagementStudio对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“ScheduleRecurrenceAndTimes”发生以下异常:“对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“StartTimeOfD......
  • prometheus-mysql
    wgethttps://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gznohup./node_exporter&netstat-lnptu|grep9100#启动mysqld_exporternohup./mysqld_exporter--config.my-cnf=./.my.cnf&#确认是否正常启动......
  • sql server 日期格式转换
    举例,日期字符串格式:mm/dd/yy   07/22/17转换日期:selectCONVERT(datetime,'07/22/17',1)输出后:2017-07-2200:00:00.000SQLServer使用科威特算法来支持阿拉伯样式的日期格式不带世纪数位(yy)(1)带世纪数位(yyyy)Standard输入/输出(3)-0或100(1,2)datet......
  • 【测试】主流数据库存储过程编写样例(Oracle、MySQL、SQL Server)
    这个...做测试其实有时候还是需要先弄点数据才好针对某些功能进行测试的(相信做过开发的都应该深有体会)。一般像我这种老油条都推荐使用存储过程来做的初始化数据,一来脚本不会骗人,二来可以通过另一种方式验证逻辑关系。下面将整理了三个主流数据库(Oracle、MySQL和SQLServer)的“单表......
  • docker mysql
    -eMYSQL_ROOT_PASSWORD=my-secret-pw-v/my/custom:/etc/mysql/conf.ddockerrun-it--rmmysql:tag--verbose--helpdockerrun--namesome-mysql-v/my/own/datadir:/var/lib/mysql-eMYSQL_ROOT_PASSWORD=123456-dmysql:tagdockerrun--namesome-mysql-e......
  • 力扣612(MySQL)-平面上的最近距离(中等)
    题目:表point_2d保存了所有点(多于2个点)的坐标(x,y),这些点在平面上两两不重合。写一个查询语句找到两点之间的最近距离,保留2位小数。 最近距离在点(-1,-1)和(-1,2)之间,距离为1.00。所以输出应该为: 解题思路:建表语句:1createtableifnotexistspoint_2d(x......
  • mysql驱动下载
    访问官网:https://dev.mysql.com/点击downloads点击MysqlCommunity(GPL)Downloads  点击Connector/J选择8.0.11版本,操作系统选择PlatformIndependent点击Download下载,下载后如下所示:  解压 ......