sqlserver存储过程的创建,从数据库中产生: 年月+顺序号的唯一编号,如果是新的一个月顺序号又从1开始。 (100分)

  • 主题发起人 主题发起人 yym
  • 开始时间 开始时间
Y

yym

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:TEST数据库中最大的一条记录为 0209069,新的一条记录则为 020970,这是在记录
也还是9月份的情况,如果是10月则变为 0210001,
如何建立存储过程,并且存储过程直接返回所需值。

select @ly=convert(char(4),getdate(),12)
--select @ly=substring(CONVERT(char(12), GETDATE(),12),1,4)
select @reccount=MAX(CONVERT(int, SUBSTRING(编号, 5, 3))) From mo where 编号 like @ly+'%'
if @reccount is null
set @reccount=0
set @reccount=@reccount+1
Set @maxmonum=@ly+substring('00'+convert(varchar,@reccount),len(convert(varchar,@reccount)),3)
 
Create Proc GetRecNo @RecNo OutPut As
Begin
Declare @MonthType Char(4)
Declare @MaxRecNo VarChar(10)
Set @MonthType=Right(Convert(Char(6),GetDate(),112),4)
Select @MaxRecNo=Max(RecNo) From Test
if @MonthType=Left(@MaxReNo,4) //同一個月
@MaxRecNo=...
else
@MaxRecNo=...
Set @RecNo=@MaxRecNo
end
 
那你直接根据你传递的年份月份得到最大值,然后加1不就可以了。
数值转化一下就行了,自己努力哦。
 
用 getdata()函来取得年和月然后截取后面流水号转换后累加
 
Declare @ly Char(4)
Declare @RecNo VarChar(10)
declare @reccount int
SELECT @ly=substring(CONVERT(char(12), GETDATE(),12),1,4)
Select @reccount=Max(convert(int,substring(RecNo,5,3)))
From Test where recno like @RecNo+'%'
if @reccount is null
set @reccount=0

set @reccount=@reccount+1
Set @RecNo=@RecNo+substring('00'+convert(varchar,@reccount),len(convert(varchar,@reccount)),3)
-- 0的個數為流水碼位數-1 流水碼位數

 
更正
Declare @ly Char(4) --年月
Declare @RecNo VarChar(10)
declare @reccount int
SELECT @ly=substring(CONVERT(char(12), GETDATE(),12),1,4)
Select @reccount=Max(convert(int,substring(RecNo,5,3)))
From Test where recno like @ly+'%'
if @reccount is null
set @reccount=0

set @reccount=@reccount+1
Set @RecNo=@ly+substring('00'+convert(varchar,@reccount),len(convert(varchar,@reccount)),3)
-- 0的個數為流水碼位數-1 流水碼位數

 
我这刚好有这一段,功能和你要的差不多,我是在触发器中实现的
CREATE TRIGGER [TRIGGER NAME100] ON [dbo].[CRcvMain]
FOR INSERT
AS
SET NOCOUNT ON
--自动生成采购单号
DECLARE @MONTH VARCHAR(2)
DECLARE @NO INTEGER
DECLARE @AUTONO VARCHAR(15)
DECLARE @TMP VARCHAR(5)
DECLARE @YEAR VARCHAR(4)
SELECT @MONTH=MONTH(收货日期),@YEAR=YEAR(收货日期) FROM INSERTED
--找出月份
SELECT @MONTH=REPLICATE('0',2-DATALENGTH(@MONTH))+@MONTH
--找出是第几张
SELECT @NO=COUNT(*) FROM CRCVMAIN WHERE YEAR(收货日期)=@YEAR
AND MONTH(收货日期)=@MONTH
SET @TMP=CAST(@NO AS VARCHAR(5))
SET @TMP=REPLICATE('0',3-DATALENGTH(@TMP))+@TMP--这是固定格式
SET @AUTONO=@MONTH+@TMP
UPDATE CRCVMAIN SET 采购单号=@AUTONO WHERE [ID] IN(SELECT ID FROM INSERTED)
SET NOCOUNT OFF


 
楼上几位朋友的存储过程不是很好!如果有多位同时操作该表,那单号就有可能完全相同,
如果有相同单号,单号如果用作关键字段,保存时候就要出错,那就要人为修改或其它动作
变更该单号,这可能单号就不连续了.可用存储过程解决这问题!
 
同意楼上,如要看源码,我可以提供
 
关注,我刚写了一段,但是前面是以年为单位的。
感觉应该解决了多用户访问的问题
我测试了四个客户端同时插入、删除、查询、修改1万条记录,未发生错误,单号为主键
 
不用存储过程用D6编程不也可以实现吗?
只要调用时机适当就不会有什么问题。
我编过一个小过程可以完成如RK2002010022、RK02010022此类的单号加1操作。
 
多人接受答案了。
 
后退
顶部