日期:2014-05-16  浏览次数:20511 次

SQL 自增字符串字段 版本2008
SQL如何创建一个自增的字符串字段呢?
想要实现的效果如下:
[申请编号]: ABC140400001
解析:[申请编号]为字段名称,ABC为自定义前缀,1404为日期字符串即14年4月,00001为自增计数
然后想要每个月置计数,即到5月份后再重新开始从1自增计数
- -搜索了下,得到提示要自己创建一个函数,并关联到字段
但是我自己老是失败,求解答,万分感谢!
我的做法:
参照网上的别人的函数在[可编程性]/[函数],右键新建函数
CREATE FUNCTION [dbo].[f_NextBH]()
RETURNS char(8)
AS
BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX([申请编号]),6),0),6) FROM [table] WITH(XLOCK,PAGLOCK))
END


- -然后完全不是自己想的那样额,是函数写错了麽?还是方法错了额?

------解决方案--------------------
drop table tb
create table tb (申请编号 varchar(20))
go
Alter FUNCTION [dbo].[f_NextBH]()
RETURNS char(13)
AS
BEGIN
    RETURN(SELECT 'ABC'+ substring (Cast(year(getdate())as varchar(4)),3,2) + substring(Convert(Varchar(10), GetDate(), 120),6,2)+RIGHT(100001+ISNULL(RIGHT(MAX([申请编号]),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
go
select * from  tb
go
select [dbo].[f_NextBH]()

有的地方不是很完美,给你参考下
------解决方案--------------------
这个是我之前写的一个自动获取单号的存储过程,LZ可以参考一下喔.
单号格式: "MS"+2位年+2位月+2位日+4位流水号

create proc dbo.pro_getNewBillno
as
begin
  set nocount on
  declare @h int, @ybillNO varchar(50)

  select @h=max(cast(right(ybillNO,4) as int))+1 from dbo.t_salesHeader (nolock) 
   where ybillNO like 'MS'+substring(convert(varchar,getdate(),112),3,8)+'%'

  select @ybillNO='MS'+substring(convert(varchar,getdate(),112),3,8)
                  +case when @h is null then '0001' else replicate('0',4-len(@h))+rtrim(@h) end
                  
  select @ybillNO 'ybillNO'
end
go

------解决方案--------------------
cast 可以去掉


create table test(编号 nvarchar(20))
DECLARE @Sequence varchar(5)                   
SET @Sequence = RIGHT(        
        (        
            SELECT MAX(编号)        
            FROM   test        
            WHERE   编号 LIKE 'ABC'+ replace(substring(convert(varchar(100),GETDATE(),121),3,5),'-','') + '%'        
        ),        
        5       
)          &nb