SQL Server利用存储过程生成流水号

USE BiddingConfig
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
-- =============================================
-- Author: 小爽
-- Create date: 2017-05-25
-- Description: 业务数据KEY生成
-- 构成规则: [区域编号][应用系统编号][版本编号][功能编号][日期戳][流水记录号]
-- 数据长度: 28位
-- [区域编号]: 6位 例:320100
-- [系统编号]: 2位(交易平台[10+](业务系统、辅助开评标系统)、公共服务平台[40+]、监督平台[50+]、其他扩展[60+])
-- [版本编号]: 2位(10+)
-- [功能编号]: 4位
-- [日期戳]: 8位,格式化yyMMdd
-- [流水号]: 6位,应该当日记录流水号
-- =============================================
ALTER PROCEDURE [dbo].[proc_BuildBizDataKey]
(
@AppNo NCHAR(2), -- 系统编号
@FunctionNo NVARCHAR(10), -- 功能编号
@ReturnValue NCHAR(28) OUTPUT -- 业务数据KEY
)
AS
BEGIN
-- ======================================= 变量定义
DECLARE @AreaNo NCHAR(6) = '' -- 区域编号
DECLARE @VersionNo NCHAR(2) = '' -- 版本编号
DECLARE @LastSerialNo NCHAR(6) = '' -- 上次流水号
DECLARE @SerialNo NCHAR(6) = '' -- 流水号
DECLARE @TodayDate NCHAR(8) = '' -- 当前日期
-- ======================================================================= 变量赋值
SET @TodayDate = REPLACE(CONVERT(NVARCHAR(10),GETDATE(),120),'-','') -- 当前日期格式化:yyyyMMdd BEGIN TRY
BEGIN TRANSACTION IF(LEN(@FunctionNo)>4)
BEGIN
SET @FunctionNo =SUBSTRING(@FunctionNo,3,4)
END -- 验证参数
IF(ISNULL(@AreaNo,'') = '' OR ISNULL(@AppNo,'') = '' OR ISNULL(@VersionNo,'') = '' OR ISNULL(@FunctionNo,'') = '' OR ISNULL(@FunctionNo,'') = '')
BEGIN
RAISERROR ('空参数!', 11, 1)
END -- 取得上次业务数据KEY
SELECT
@LastSerialNo = ISNULL([SerialNo],'')
FROM [biz_DataKey]
WHERE [AreaNo] = @AreaNo
AND [AppNo] = @AppNo
AND [VersionNo] = @VersionNo
AND [FuncionNo] = @FunctionNo
AND [DateStamp] = @TodayDate
-- 数据KEY不存在,生成新KEY
IF (ISNULL(@LastSerialNo,'') = '')
BEGIN
SET @SerialNo = ''
SET @ReturnValue = @AreaNo + @AppNo + @VersionNo + @FunctionNo + @TodayDate + @SerialNo
-- 创建业务数据KEY
INSERT INTO [biz_DataKey]
([AreaNo]
,[AppNo]
,[VersionNo]
,[FuncionNo]
,[DateStamp]
,[SerialNo])
VALUES
(@AreaNo
,@AppNo
,@VersionNo
,@FunctionNo
,@TodayDate
,@SerialNo)
END
ELSE
BEGIN
SET @SerialNo = RIGHT('' + CAST((CONVERT(INT,RIGHT(@LastSerialNo,6))+1) AS NVARCHAR(10)),6)
SET @ReturnValue = @AreaNo + @AppNo + @VersionNo + @FunctionNo + @TodayDate + @SerialNo
-- 更新业务数据KEY
UPDATE [biz_DataKey]
SET [SerialNo] = @SerialNo
,[LastKeyDate] = GETDATE()
WHERE [AreaNo] = @AreaNo
AND [AppNo] = @AppNo
AND [VersionNo] = @VersionNo
AND [FuncionNo] = @FunctionNo
AND [DateStamp] = @TodayDate
END COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SET @ReturnValue = ''
SELECT ERROR_MESSAGE()
END CATCH
END GO

执行存储过程方法:

DECLARE @AppNo NVARCHAR(2) = ''                -- 系统编号
DECLARE @FunctionNo NVARCHAR(10) = '' -- 功能版本号
DECLARE @DataKey NVARCHAR(50) = '' -- DataKey -- 取得DataKey
EXEC BiddingConfig.[dbo].[proc_BuildBizDataKey] @AppNo = @AppNo,@FunctionNo = @FunctionNo, @ReturnValue = @DataKey OUTPUT

附加存放流水号表:

CREATE TABLE [dbo].[biz_DataKey](
[AreaNo] [nchar](6) NOT NULL,
[AppNo] [nchar](2) NOT NULL,
[VersionNo] [nchar](2) NOT NULL,
[FuncionNo] [nchar](4) NOT NULL,
[DateStamp] [nchar](8) NOT NULL,
[SerialNo] [nchar](6) NOT NULL,
[LastKeyDate] [datetime] NULL)

SQL Server 存储过程生成流水号的更多相关文章

  1. SQL Server 存储过程生成insert语句

    你肯定有过这样的烦恼,同样的表,不同的数据库,加入你不能执行select  insert 那么你肯定需要一条这样的存储过程,之需要传入表明,就会给你生成数据的插入语句. 当然数据表数量太大,你将最好用 ...

  2. SQL SERVER存储过程生成字母+数字的编码

    公司内设备管理系统中设备建账功能,功能目的是对新进设备进行记录并入库.其中设备编号一项定义为自己修改(查看之前的设备号,取一个不重复的值来填写),感觉特别麻烦!用存储过程自动生成编码岂不是更效率. 需 ...

  3. 如何在SQL Server中生成和使用CRUD存储过程

    在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...

  4. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  5. SQL Server 存储过程具体解释

    SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理 ...

  6. sql server 存储过程 output 和return的使用 方法,详解

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  7. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  8. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  9. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

随机推荐

  1. struts2中struts.xml和web.xml文件解析及工作原理

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp ...

  2. C# 属性事件一些设置说明

    大致列举一些常用的属性或事件的一些修饰 用法类似,主要是对属性的进一步设置 [Browsable(true)] public bool Enable {get;set;} 顺便说一下事件的应用: pu ...

  3. Spring 4 官方文档学习(六)核心技术之Spring AOP

    目录 1.介绍 1.1.AOP概念 1.2.Spring AOP 能力 和 目标 1.2.1.简介 1.2.2.@AspectJ 支持 1.2.3.声明一个aspect 例子 1.2.4.声明advi ...

  4. vector、map删除当前记录

    map<string, string> sMap; map<string, string>::iterator iter; for(iter = sMap.begin();it ...

  5. MODEL-View-Controller,既模型-视图-控制器

    Swing组件采用MVC(MODEL-View-Controller,既模型-视图-控制器)设计模式,其中模型(Model)用于维护组件的各种状态,视图(View)是组件的可视化表现,控制器(Cont ...

  6. hdu 1281 棋盘游戏 (二分匹配)

    //是象棋里的车 符合二分匹配 # include<stdio.h> # include<algorithm> # include<string.h> using ...

  7. 转载:【原译】Erlang构建和匹配二进制数据(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/19/2727204.html Constructing and matching binarie ...

  8. 二分求幂,快速求解a的b次幂

    一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; ; cin >> a >> b; ; i < ...

  9. path与classpath的差别

    1.path的作用     path是系统用来指定可运行文件的完整路径.即使不在path中设置JDK的路径也可运行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\ ...

  10. centos7,yum安装工具报错

    1.问题描述:yum安装gcc和其他的工具时一直报错: 2.问题解决: 网上看到有类似文章: No more mirrors to try. 得知这可能是错误的缓存源导致,直接两个命令解决: yum ...