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