一个MSSql的存储过程生成编码,形如HEAD20060512000001;(头+日期+6位递增整数)后面为六位,每新的一年编号重新归0

    这个存储过程的作用是自动生成编号,比如我们在数据库中有个**票编号字段,该存储过程可以生成格式为头(自己定义的一个头,比如AA)+日期(形如20070401)+6位递增整数(形如002254),并且每到了新的一年后面的6位整数便会归0重新开始。其中用到了动态执行sql的方法。参数有四个,需要给出表名称,字段名称,头和一个返回值。
=============================================
-- Author:        <vagerent>
--
 Create date: <2006-12-14>
--
 Description:    <获取编码,形如HEAD20060512000001;(头+日期+6位整数)后面为六位,每新的一年编号重新

归0
>
-- =============================================
Create PROCEDURE [dbo].[mp_GetPKNo]
    
@sTableName varchar(50),
    
@sFieldName varchar(50),--目标字段
    @sHead varchar(50),--前缀,如Head等
    @sPK varchar(50) out --输出

AS
BEGIN
    
declare @dToday datetime,@sToday varchar(10),
        
@sYear varchar(10),@sSubID varchar(20),@sSql nvarchar(1000);--动态sql一定要用

nvarchar!!!
    
    
set @dToday = getdate();
    
set @sToday = Convert(varchar,Year(@dToday))
        
+SubString(Convert(varchar,Month(@dToday)+100),2,2)
        
+SubString(Convert(varchar,Day(@dToday)+100),2,2);
    
--select @sToday--形如20060512
    set @sYear=Convert(varchar(10),Year(getdate()))
    
--select @sYear--形如2006
    
    
declare @sHead1 varchar(30),@iHeadLength int;
    
set @sHead1=@sHead+@sYear;--形如HEAD2006
    --select @sHead1;--形如HEAD2006
    set @iHeadLength=Len(@sHead1);
    
--select @iHeadLength;--形如6
    set @sSql = N'select @sSubID=Max(SubString('
        
+@sFieldName+','+Convert(varchar(10),@iHeadLength+5)+',6)) from '
        
+@sTableName+' where SubString('+@sFieldName+',1,'
        
+Convert(varchar(10),@iHeadLength)+')='''+@sHead1+'''';
    
--select @sSql;--形如select..
    exec sp_executesql @sSql,N'@sSubID varchar(20) output',@sSubID output;

    
if ((@sSubID=''or (@sSubID is null))
        
set @sSubID='000001'
    
else
    
begin
        
declare @iSubID int;
        
set @iSubID=Convert(int,@sSubID)+1000001;
        
set @sSubID=SubString(Convert(varchar,@iSubID),2,6)
    
end
    
--select @sSubID;
    set @sPK=@sHead+@sToday+@sSubID;

return
END
原文地址:https://www.cnblogs.com/vagerent/p/696708.html