引用下ZJCXC的生成编号法 --编号表 CREATE TABLE tb_NO( Name char(2) NOT NULL, --编号种类的名称 Days int NOT NULL, --保存的是该种编号那一天的当前编号 Head nvarchar(10) NOT NULL DEFAULT '', --编号的前缀 CurrentNo int NOT NULL DEFAULT 0, --当前编号 BHLen int NOT NULL DEFAULT 6, --编号数字部分长度 YearMoth int NOT NULL --上次生成编号的年月,格式YYYYMM DEFAULT CONVERT(CHAR(6),GETDATE(),112), DESCRIPTION NVARCHAR(50), --编号种类说明 TableName sysname NOT NULL, --当前编号对应的原始表名 KeyFieldName sysname NOT NULL, --当前编号对应的原始表编号字段名 PRIMARY KEY(Name,Days))--这里以一种单据的7天的资料来做测试 INSERT tb_NO SELECT 'CG',1,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',2,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',3,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',4,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',5,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',6,'CG',0,4,200501,N'采购订单',N'tb',N'bh' UNION ALL SELECT 'CG',7,'CG',0,4,200501,N'采购订单',N'tb',N'bh' GO--获取新编号的存储过程 CREATE PROC p_NextBH @Name char(2), --编号种类 @Date datetime=NULL, --要获取的当前日期,不指定则为系统当前日期 @BH nvarchar(20) OUTPUT --新编号 AS IF @Date IS NULL SET @Date=GETDATE() BEGIN TRAN --从编号表中获取新编号 UPDATE tb_NO SET @BH=Head +CONVERT(CHAR(6),@Date,12) +RIGHT(POWER(10,BHLen) +CASE WHEN YearMoth=CONVERT(char(6),@Date,112) THEN CurrentNo+1 ELSE 1 END ,BHLen), CurrentNo=CASE WHEN YearMoth=CONVERT(char(6),@Date,112) THEN CurrentNo+1 ELSE 1 END, YearMoth=CONVERT(char(6),@Date,112) WHERE Name=@Name AND Days=DAY(@Date) AND YearMoth<=CONVERT(char(6),@Date,112) --如果要获取的编号在编号表中已经过期,则直接从原始表中取编号 IF @@ROWCOUNT=0 BEGIN DECLARE @s nvarchar(4000) SELECT @s=N'SELECT @BH=' +QUOTENAME(Head+CONVERT(CHAR(6),@Date,12),N'''') +N'+RIGHT('+CAST(POWER(10,BHLen)+1 as varchar) +N'+ISNULL(RIGHT(MAX('+QUOTENAME(KeyFieldName) +N'),'+CAST(BHLen as varchar) +N'),0),'+CAST(BHLen as varchar) +N') FROM '+QUOTENAME(TableName) +N' WITH(XLOCK,PAGLOCK) WHERE ' +QUOTENAME(KeyFieldName) +N' like '+QUOTENAME(Head+CONVERT(CHAR(6),@Date,12)+N'%',N'''') FROM tb_NO WHERE Name=@Name AND Days=DAY(@Date) AND YearMoth>CONVERT(char(6),@Date,112) IF @@ROWCOUNT>0 EXEC sp_executesql @s,N'@BH nvarchar(20) OUTPUT',@BH OUTPUT END COMMIT TRAN GOCREATE TABLE tb(BH char(12)) --获取 CG 的新编号 DECLARE @bh char(12) EXEC p_NextBH 'CG','2005-1-1',@bh OUT SELECT @bh --结果: CG0501010001EXEC p_NextBH 'CG','2005-1-1',@bh OUT SELECT @bh --结果: CG0501010002EXEC p_NextBH 'CG','2005-1-2',@bh OUT SELECT @bh --结果: CG0501020001EXEC p_NextBH 'CG','2005-2-2',@bh OUT SELECT @bh --结果: CG0402020001EXEC p_NextBH 'CG','2004-2-2',@bh OUT SELECT @bh --结果: CG0402020001 GO
StringBuilder sb = new StringBuilder(); sb.Append(DateTime.Now.ToString("yyyyMMddhhmm"));//时间前缀 sb.Append("A");//字符A //获取数据库中目前最大的存单号 SqlCommand com = new SqlCommand("Select max(id) From [Table]", conn); …… //读出数来再加1 MessageBox.Show(sb.ToString());
dt.year.tostring+dt.month.tostring("00")+dt.day.tostring("00")
CREATE TABLE tb_NO(
Name char(2) NOT NULL, --编号种类的名称
Days int NOT NULL, --保存的是该种编号那一天的当前编号
Head nvarchar(10) NOT NULL DEFAULT '', --编号的前缀
CurrentNo int NOT NULL DEFAULT 0, --当前编号
BHLen int NOT NULL DEFAULT 6, --编号数字部分长度
YearMoth int NOT NULL --上次生成编号的年月,格式YYYYMM
DEFAULT CONVERT(CHAR(6),GETDATE(),112),
DESCRIPTION NVARCHAR(50), --编号种类说明
TableName sysname NOT NULL, --当前编号对应的原始表名
KeyFieldName sysname NOT NULL, --当前编号对应的原始表编号字段名
PRIMARY KEY(Name,Days))--这里以一种单据的7天的资料来做测试
INSERT tb_NO SELECT 'CG',1,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',2,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',3,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',4,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',5,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',6,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
UNION ALL SELECT 'CG',7,'CG',0,4,200501,N'采购订单',N'tb',N'bh'
GO--获取新编号的存储过程
CREATE PROC p_NextBH
@Name char(2), --编号种类
@Date datetime=NULL, --要获取的当前日期,不指定则为系统当前日期
@BH nvarchar(20) OUTPUT --新编号
AS
IF @Date IS NULL SET @Date=GETDATE()
BEGIN TRAN
--从编号表中获取新编号
UPDATE tb_NO SET
@BH=Head
+CONVERT(CHAR(6),@Date,12)
+RIGHT(POWER(10,BHLen)
+CASE
WHEN YearMoth=CONVERT(char(6),@Date,112)
THEN CurrentNo+1
ELSE 1 END
,BHLen),
CurrentNo=CASE
WHEN YearMoth=CONVERT(char(6),@Date,112)
THEN CurrentNo+1
ELSE 1 END,
YearMoth=CONVERT(char(6),@Date,112)
WHERE Name=@Name
AND Days=DAY(@Date)
AND YearMoth<=CONVERT(char(6),@Date,112) --如果要获取的编号在编号表中已经过期,则直接从原始表中取编号
IF @@ROWCOUNT=0
BEGIN
DECLARE @s nvarchar(4000)
SELECT @s=N'SELECT @BH='
+QUOTENAME(Head+CONVERT(CHAR(6),@Date,12),N'''')
+N'+RIGHT('+CAST(POWER(10,BHLen)+1 as varchar)
+N'+ISNULL(RIGHT(MAX('+QUOTENAME(KeyFieldName)
+N'),'+CAST(BHLen as varchar)
+N'),0),'+CAST(BHLen as varchar)
+N') FROM '+QUOTENAME(TableName)
+N' WITH(XLOCK,PAGLOCK) WHERE '
+QUOTENAME(KeyFieldName)
+N' like '+QUOTENAME(Head+CONVERT(CHAR(6),@Date,12)+N'%',N'''')
FROM tb_NO
WHERE Name=@Name
AND Days=DAY(@Date)
AND YearMoth>CONVERT(char(6),@Date,112)
IF @@ROWCOUNT>0
EXEC sp_executesql @s,N'@BH nvarchar(20) OUTPUT',@BH OUTPUT
END
COMMIT TRAN
GOCREATE TABLE tb(BH char(12))
--获取 CG 的新编号
DECLARE @bh char(12)
EXEC p_NextBH 'CG','2005-1-1',@bh OUT
SELECT @bh
--结果: CG0501010001EXEC p_NextBH 'CG','2005-1-1',@bh OUT
SELECT @bh
--结果: CG0501010002EXEC p_NextBH 'CG','2005-1-2',@bh OUT
SELECT @bh
--结果: CG0501020001EXEC p_NextBH 'CG','2005-2-2',@bh OUT
SELECT @bh
--结果: CG0402020001EXEC p_NextBH 'CG','2004-2-2',@bh OUT
SELECT @bh
--结果: CG0402020001
GO
StringBuilder sb = new StringBuilder();
sb.Append(DateTime.Now.ToString("yyyyMMddhhmm"));//时间前缀
sb.Append("A");//字符A
//获取数据库中目前最大的存单号
SqlCommand com = new SqlCommand("Select max(id) From [Table]", conn);
……
//读出数来再加1
MessageBox.Show(sb.ToString());
如果没有就直接加你的:20081241128A0001
如果有就用取出来,用SubString截取日期部分,与当前的日期比较
如果日期一样:
则截取取出来号码的后四位,即你的(0001),然后+1
最后用日期+你的指码字符+已经加上1的号码
如果日期不一样:
则又从当前日期+你的指码字符+00001开始
private static string set调用我就自动生成编号()
{
strSql = "select max(编号) from 表名 where 编号 like 'A%' ";
string strID = //将查询出来的编号赋值到这里 楼主自己写
if (strID == "")
{
strID = "A00001";
}
else
{
strID = jia(strID);
}
return strID;
} public static string jia(string str)
{
int MyLong=0;
int NumStart=0;
int NumLong=0;
string NumStr;
str = str.Trim();
MyLong = str.Length;
if(MyLong==0)
{
return "";
}
int j=0;
for(int i=MyLong - 1;i>=1;i--)
{
if((str.Substring(i-1,1)=="0" ||
(clsC.Cint(str.Substring(i-1,1))>=1 &&
clsC.Cint(str.Substring(i-1,1))<=9 ))==false)
{
j=i;
break;
}
}
NumStart = j + 1;
NumStr=(int(str.Substring(NumStart-1)) + 1 ).ToString();
NumLong = MyLong - NumStart + 1;
if(NumLong >= NumStr.ToString().Length)
{
return str.Substring(1-1, NumStart - 1) + copysize(NumLong-NumStr.ToString().Length,"0") + NumStr;
}
else
{
return "error";
}
} public static string copysize(int shuliang,string zifu)
{
string str="";
for(int i=1;i<=shuliang;i++)
{
str=str+zifu;
}
return str;
}
public static string GetSerialNumber(int i, int number)
{
DateTime dt = DateTime.Now;
long ticks = dt.Ticks / 10000000;
string a = ticks.ToString() + i.ToString().PadLeft(number.ToString().Length, char.Parse("0"));
return a;
}调用
for(int i=0;i<10;i++)
{
Console.WriteLine(GetSerialNumber(i,10));
}
会生成......01
......02这样的号码,不重复