根据日期+顺序号生成流水号的存储过程
2008-01-29 09:34
411 查看
前几天做一个项目,要求能按日期+顺序号生成流水号,查看网上相关方法发现都差不多,但是没有完整的编码,被逼无赖,自己做一个,顶一顶也用起来了.
本存储过程在sql server 2000下测试通过:
CREATE PROCEDURE [dbo].[CreatePcdID]
(
@PcdID char(20) output--输出派车单号
)
AS
declare @result int --当天派车记录
declare @firstresult int--第一次运行
declare @MaxPcdID char(11)--当日最大的派车单号
declare @Num int--当日流水号
set @MaxPcdID=(select Top 1 PcdID from Pcd where convert(char(10),PCDate,101)=convert(char(10),getdate(),101) order by PcdID DESC)
set @firstresult=(select count(*) from Pcd)--第一次运行系统,无记录时使用
set @result=(select count(*) from Pcd where convert(char(10),PCDate,101)=convert(char(10),getdate(),101))--查找当天记录
set @Num=cast(right(@MaxPcdID,3) as int)+1--流水号自动增加1
--变量声明部分,如下是程序主体--
if @result>0--当天已经有派车记录
set @PcdID=convert(varchar(100),getdate(),112)+replace(str(@Num,3),' ','0')
if @result=0 --当天没有记录或没有记录
set @PcdID=convert(varchar(100),getdate(),112)+'001'
if @firstresult=0
set @PcdID=convert(varchar(100),getdate(),112)+'001'
GO
如下是建表的代码
CREATE TABLE [dbo].[Pcd] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[PcdID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ItemNO] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[OrderID] [int] NOT NULL ,
[Csno] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Team] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PCDate] [smalldatetime] NOT NULL ,
[Marks] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[OthersMarks] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
测试通过,不过暂时允许一天有999个顺序号,如果到了1000个,会生成一个错误的流水号,这个倒是要注意,不过对于我的应用来说1000个流水号一天是完全充分够用的,也就没有注意进一步的改进.
本存储过程在sql server 2000下测试通过:
CREATE PROCEDURE [dbo].[CreatePcdID]
(
@PcdID char(20) output--输出派车单号
)
AS
declare @result int --当天派车记录
declare @firstresult int--第一次运行
declare @MaxPcdID char(11)--当日最大的派车单号
declare @Num int--当日流水号
set @MaxPcdID=(select Top 1 PcdID from Pcd where convert(char(10),PCDate,101)=convert(char(10),getdate(),101) order by PcdID DESC)
set @firstresult=(select count(*) from Pcd)--第一次运行系统,无记录时使用
set @result=(select count(*) from Pcd where convert(char(10),PCDate,101)=convert(char(10),getdate(),101))--查找当天记录
set @Num=cast(right(@MaxPcdID,3) as int)+1--流水号自动增加1
--变量声明部分,如下是程序主体--
if @result>0--当天已经有派车记录
set @PcdID=convert(varchar(100),getdate(),112)+replace(str(@Num,3),' ','0')
if @result=0 --当天没有记录或没有记录
set @PcdID=convert(varchar(100),getdate(),112)+'001'
if @firstresult=0
set @PcdID=convert(varchar(100),getdate(),112)+'001'
GO
如下是建表的代码
CREATE TABLE [dbo].[Pcd] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[PcdID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ItemNO] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[OrderID] [int] NOT NULL ,
[Csno] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Team] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PCDate] [smalldatetime] NOT NULL ,
[Marks] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[OthersMarks] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
测试通过,不过暂时允许一天有999个顺序号,如果到了1000个,会生成一个错误的流水号,这个倒是要注意,不过对于我的应用来说1000个流水号一天是完全充分够用的,也就没有注意进一步的改进.
相关文章推荐
- 根据表中数据生成insert语句的存储过程
- 一个生成订单流水号的存储过程
- SQL Server 存储过程生成流水号
- CodeSmith 5.0工具实例篇系列3——根据表生成新增的存储过程,针对MS Sqlserver
- sql server 根据身份证号计算出生日期和年龄的存储过程
- mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)
- 一个用来生成流水号的存储过程
- SQL SERVER 根据日期自动生成流水号
- 存储过程随机生成字符串、将long值格式化成字符串日期
- 使用系统表根据存储过程名字生成ADO.NET数据库访问代码
- 一个MSSql的存储过程---生成编码,形如HEAD20060512000001;(头+日期+6位递增整数)后面为六位,每新的一年编号重新归0
- 根据表中数据生成insert语句的存储过程
- Sql Server根据表名生成查询的存储过程(查询条件可选)
- CodeSmith 5.0工具实例篇系列4——根据表生成修改的存储过程,针对MS Sqlserver
- 存储过程生成流水号
- 根据表中数据生成insert语句的存储过程
- 根据表或者视图自动生成分页语句的存储过程,适用于Sql Server 2005及以上版本
- 根据存储过程名字生成ADO.NET数据库访问代码
- SQL存储过程生成流水号