日期:2014-05-19  浏览次数:20372 次

帮看一下是否该储存工程
为了生成生产流水,我在网上找到了以下储存过程,但是我要求生成的是不重复的流水号,当大量并发执行时,不知道这个储存过程是否能实现生成的流水号不重复呢。

因学SQL不久,还请多多指教。


CREATE   PROCEDURE   [return_InputCode]
AS
BEGIN
        DECLARE   @intID   INT,   @strID   CHAR(16),     @intY   INT,   @intM   INT,     @intD   INT,   @myDate   datetime,     @xtDate     datetime
        SET   @myDate=GETDATE()
        SET   @intY=YEAR(@myDate)
        SET     @intM=MONTH(@myDate)
        SET       @intD=DAY(@myDate)
        SELECT   @xtDate   =SaveDate   ,@intID=InPutCode   FROM   JXC_Code
        IF     ((@intY!=YEAR(@xtDate))   OR   (@intM!=MONTH(@xtDate))     OR   (@intD!=DAY(@xtDate)))
                BEGIN
                  UPDATE   JXC_Code   SET   SaveDate=@myDate,     InPutCode= '1000002 '
                  SET   @intID= '1000001 '
                END
      ELSE
                BEGIN
                  UPDATE   JXC_Code   SET   InPutCode=InPutCode+1
                END
      SET   @intY=YEAR(@myDate)
      SET   @intM=MONTH(@myDate)+100
      SET   @intD=DAY(@myDate)+100
      SET     @strID=STR(@intY,4,1)+SUBSTRING(STR(@intM,3,1),2,2)+SUBSTRING(STR(@intD,3,1),2,2)+SUBSTRING(STR(@intID,7,1),2,6)
      SELECT   @strID   as   code
END
GO

------解决方案--------------------
可以同用一个编码表
如下
只是简单的人
复杂的可分为两个表

--建表
create table infoTableNo
(
NoId int primary key,
NoName varchar(200),
NoTypeId int, --编号类型(如:流水号,年月流水号,年月日流水号)
Prefix varchar(20), --前缀
CurrentNo int, --当前数字编号
NoPartLen int, --编号数字部分长度
UpdateDate char(8) --格式:20060517
)

insert infoTableNo
select 1, '订单号 ',1, 'ORD ',0,4, ' '
select 2, '制造批号 ',1, 'MRD ',0,5, ' '


/*----------------------------------------
--创建表编号
--yys 2006/05/17
*/
create proc CreateTableNo
(
@ReturnCode int=0 output,
@ReturnCount int=0 output,
@NewNo varchar(100) output,
@NoId int--编号标识
)
as
--当前日期
declare @CurrentDate char(8)
set @CurrentDate=convert(char(8),getdate(),112)
begin transaction
--读取当天最新编号信息
declare @Prefix varchar(20) --前缀
declare @CurrentNo int --当前数字编号
declare @NoPartLen int --编号数字部分长度
declare @UpdateDate char(8) --最新更新日期


select
@Prefix=Prefix,
@CurrentNo=CurrentNo,
@NoPartLen=NoPartLen,
@UpdateDate=UpdateDate
from infoTableNo with(PAGLOCK)
where NoId=@NoId

select @ReturnCode=@@error,@ReturnCount=@@rowcount
if @ReturnCode <> 0 or @ReturnCount =0 goto RollbackAndReturn

--这里只处理年月日流水号
if