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. 利用kseq.h parse fasta/fastq 文件

    在分析中经常需要统计fasta/fastq文件的序列数和碱基数, 但是没有找到一些专门做这件事的小工具,可能是这个功能太简单了: 之前用自己写的perl的脚本统计这些信息, 当fastq文件非常大时, ...

  2. js for form

    //表单填充   表单填充        , formDataLoad: function (domId, obj) {            for (var property in obj) {  ...

  3. javascript变量声明前置

    变量声明前置: 所谓的变量声明前置就是在一个作用域块中,所有的变量都被放在块的开始出声明,下面举个例子你就能明白了 var a = 1; function main() { console.log(a ...

  4. STL 源代码剖析 算法 stl_algo.h -- search_n

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ------------------------------------- ...

  5. Oracle会话及连接数优化

    一.改动Oracle会话及最大连接数 1.查看最大连接数 SQL> show parameter processes; NAME                                 ...

  6. osgEarth的agglite插件使用例子feature_rasterize.earth

    <!-- osgEarth Sample Demonstrates use of the "agglite" feature rasterization driver. -- ...

  7. Oracle的闪回操作

    Oracle10g中引入了闪回技术,但这并不意味着所有的表都能闪回成功,当没有足够的磁盘空间,Oracle将使用回收站中的磁盘空间,而且位图连接索引和引用完整性约束也不受回收站的保护. recycle ...

  8. easyui 时间定格为 时分

    $.fn.datetimebox.defaults.formatter = function (date) { console.log('dt formatting ' + date); if (!( ...

  9. Effective C++ —— 资源管理(三)

    条款13 : 以对象管理资源 假设有如下代码: Investment* createInvestment(); //返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它 vo ...

  10. C++11新特性之一——Lambda表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...