如何解决流水号重复

camy 2006-06-04 11:29:54
以下是一个产生流水号的SP,产生的流水号类似200601200001, 发现使用这个流水号的模块里偶尔会出现重复的单号.
请问SP的执行是并行的还是队列方式?如果可以并发执行,估计有可能产生这种问题,能否设定这个SP执行完才能被再次调用?
另外,使用相关模块的电脑是单机多用户系统,一台主机2人操作,会不会因此导致流水号重复?
请高手帮我诊断一下.


CREATE PROCEDURE GetNewID

AS

DECLARE @TMP1 CHAR(4),@TMP2 CHAR(2),@TMP3 CHAR(2),@TMP4 CHAR(4),@TMP5 CHAR(4)

SET @TMP1=LTRIM(RTRIM(STR(YEAR(GETDATE()))))
SET @TMP2=LTRIM(RTRIM(STR(MONTH(GETDATE()))))
SET @TMP3=LTRIM(RTRIM(STR(DAY(GETDATE()))))
SELECT @TMP2=REPLICATE('0',2-LEN(@TMP2))+@TMP2
SELECT @TMP3=REPLICATE('0',2-LEN(@TMP3))+@TMP3
SELECT @tmpid=@TMP1+@TMP2+@TMP3
select @TMP1=RIGHT(RTRIM(MAX(NO)),4) from Int_Rcv_ID where LEFT(no,8)=@TMPID
SELECT @TMP1=ISNULL(@TMP1,'0000')
SELECT @TMP4=LTRIM(RTRIM(STR(CAST(@TMP1 AS INT)+1)))
SELECT @TMP4=REPLICATE('0',4-LEN(@TMP4))+@TMP4
SELECT @TMPID=RTRIM(@TMPID)+@TMP4
INSERT INTO Int_Rcv_ID (no) VALUES (@TMPID)
SELECT @TMPID NEWID
...全文
830 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
camy 2006-06-04
  • 打赏
  • 举报
回复
对,有可能问题出在INSERT执行失败.最后2句改成:

INSERT INTO Int_Rcv_ID (no) VALUES (@TMPID)
IF @@error=0
SELECT @TMPID NEWID
else
RAISERROR('生成流水号失败.',16,1)

能否解决问题还要等测试,因为出现几率不高.
OracleRoob 2006-06-04
  • 打赏
  • 举报
回复
直接在表中限定流水号字段唯一约束更简单,如果追加失败,给出友好提示后重新获取流水号!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧