可以做 04090001分为2个部分,04年09月0001流水号0409做为一个部分可以通过程序生成 然后到数据库中查找有没有04090001,有的话为max(字段)+1,没有的话为04090001(当前月第一条数据)oracle里我都在sql里写 select decode('','0409'||'0001',max(字段)+1) from 表 where 字段='0409'||'0001'
建立存储过程 CREATE PROCEDURE Sp_bhAS /* -------------------------------------------------------- --返回表的编号,四位流水号 ------------------------------------------------------- */ Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20) Declare @num intset @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2) select @str2=max(编号) from 表 where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))='' set @str2='0000'set @str2=right(@str2,4) set @num=cast(@str2 as int) set @num=@num+1 set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4) set @str_ret=@str1+@str2select @str_retGO
建立存储过程 CREATE PROCEDURE Sp_bhAS /* -------------------------------------------------------- --返回表的编号,四位流水号 ------------------------------------------------------- */ Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20) Declare @num intset @str1=right('00'+ltrim(rtrim(str(year(getdate())))),2)+right('00'+ltrim(rtrim(str(month(getdate())))),2) select @str2=max(编号) from 表 where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))='' set @str2='0000'set @str2=right(@str2,4) set @num=cast(@str2 as int) set @num=@num+1 set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4) set @str_ret=@str1+@str2select @str_retGO
public class RegID {
int id; int year; int month;
public virtual string CreateID(int ID) {
string connectionSQL=System.Configuration.ConfigurationSettings.AppSettings["BUS_CSTRING"]; string SQL = "SELECT MAX(SUBSTRING(BUS_RecordID,13,4)) AS i FROM BUS_RECORD WHERE (PROC_ID = @id) AND (DATEPART(year, BUS_SUBMIT_TIME) = @year) AND (DATEPART(month, BUS_SUBMIT_TIME) = @month)";
SqlConnection connect1; connect1 = new SqlConnection(connectionSQL); SqlCommand cmd; cmd = new SqlCommand(SQL,connect1);
TO wtadminxjeri(P42.4): 你误会我意思了,按我理解,我觉得单纯用程序代码或者存储过程去计算新的流水号,一样会有同步异步的问题,就像你所说的“代码执行期间,有另外一笔数据进入”,我觉得应该有一个核心问题,无论是在代码中,还是在存储过程中,应该都用到一个互斥的思想,就是说,当前我正在计算一个新的流水号时,保存有当前最新流水号的变量(或者是数据库中的记录)是不允许其它人去访问修改的,就像上面JafyLiu(JafyLiu) 所说的,用一个表了保存当前月最新的流水号,计算新流水号的时候,先UPDATE加1,然后再用UPDATE后生成的号来生成流水号,利用数据库中访问数据的互斥性来解决冲突,当然,流水号字段建立唯一索引来产生约束是必要的,但在计算流水号的过程中就应该保存计算出来的流水号是唯一的也是必要的,要不然,计算出新流水号之后,利用这个流水号在其它表添加新记录的时候才发现流水号已经重复了,那就更麻烦了,特别是Web程序
关于"wtadminxjeri"给的存储过程 CREATE PROCEDURE Sp_bh @table varchar(20) AS /* -------------------------------------------------------- --返回表的编号,四位流水号 ------------------------------------------------------- */ Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20) Declare @num intset @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2) select @str2=max(编号) from @table where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))='' set @str2='0000'set @str2=right(@str2,4) set @num=cast(@str2 as int) set @num=@num+1 set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4) set @str_ret=@str1+@str2select @str_retGO 为什么我增加一输入参数@table却通不过语法检查,这是为什么呀? 提示为“必须增加变量@table"
CREATE PROCEDURE Sp_bh ( @table varchar(20) ) AS
我想这样可以,oracle下select decode(MAX(t.glide), null,'0409' || '0001', to_number(t.glide)+1) from table1 t where substr(t.glide,0,4) like '0409'
http://www.pdriver.com/bbs2004/dispbbs.asp?boardID=14&replyID=733870&ID=115300&skin=1
这就好弄多了
04090001分为2个部分,04年09月0001流水号0409做为一个部分可以通过程序生成
然后到数据库中查找有没有04090001,有的话为max(字段)+1,没有的话为04090001(当前月第一条数据)oracle里我都在sql里写
select decode('','0409'||'0001',max(字段)+1) from 表 where 字段='0409'||'0001'
CREATE PROCEDURE Sp_bhAS
/*
--------------------------------------------------------
--返回表的编号,四位流水号
-------------------------------------------------------
*/
Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20)
Declare @num intset @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2)
select @str2=max(编号) from 表 where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))=''
set @str2='0000'set @str2=right(@str2,4)
set @num=cast(@str2 as int)
set @num=@num+1
set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
set @str_ret=@str1+@str2select @str_retGO
CREATE PROCEDURE Sp_bhAS
/*
--------------------------------------------------------
--返回表的编号,四位流水号
-------------------------------------------------------
*/
Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20)
Declare @num intset @str1=right('00'+ltrim(rtrim(str(year(getdate())))),2)+right('00'+ltrim(rtrim(str(month(getdate())))),2)
select @str2=max(编号) from 表 where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))=''
set @str2='0000'set @str2=right(@str2,4)
set @num=cast(@str2 as int)
set @num=@num+1
set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
set @str_ret=@str1+@str2select @str_retGO
{
int id;
int year;
int month;
public virtual string CreateID(int ID)
{
string connectionSQL=System.Configuration.ConfigurationSettings.AppSettings["BUS_CSTRING"];
string SQL = "SELECT MAX(SUBSTRING(BUS_RecordID,13,4)) AS i FROM BUS_RECORD WHERE (PROC_ID = @id) AND (DATEPART(year, BUS_SUBMIT_TIME) = @year) AND (DATEPART(month, BUS_SUBMIT_TIME) = @month)";
SqlConnection connect1;
connect1 = new SqlConnection(connectionSQL);
SqlCommand cmd;
cmd = new SqlCommand(SQL,connect1);
connect1.Open();
cmd.Parameters.Add("@id",SqlDbType.Int,5);
cmd.Parameters.Add("@year",SqlDbType.Int,5);
cmd.Parameters.Add("@month",SqlDbType.Int,5);
year=DateTime.Now.Year;
month=DateTime.Now.Month;
cmd.Parameters["@id"].Value =ID;
cmd.Parameters["@year"].Value =year;
cmd.Parameters["@month"].Value =month;
SqlDataReader reader = cmd.ExecuteReader();
string j;
if(reader.Read())
{
j=reader["i"].ToString();
if (j=="")
{
id=1;
}
else
{
id=Convert.ToInt32(j)+1;
}
}
reader.Close();
connect1.Close();
string procID=ID.ToString("0000");
//select database to set userCount where busId=busID
string strDate=DateTime.Now.ToString("yyyyMM");
string strUserCount=id.ToString("0000");
return procID +"-"+strDate+"-"+strUserCount;
}
}
你误会我意思了,按我理解,我觉得单纯用程序代码或者存储过程去计算新的流水号,一样会有同步异步的问题,就像你所说的“代码执行期间,有另外一笔数据进入”,我觉得应该有一个核心问题,无论是在代码中,还是在存储过程中,应该都用到一个互斥的思想,就是说,当前我正在计算一个新的流水号时,保存有当前最新流水号的变量(或者是数据库中的记录)是不允许其它人去访问修改的,就像上面JafyLiu(JafyLiu) 所说的,用一个表了保存当前月最新的流水号,计算新流水号的时候,先UPDATE加1,然后再用UPDATE后生成的号来生成流水号,利用数据库中访问数据的互斥性来解决冲突,当然,流水号字段建立唯一索引来产生约束是必要的,但在计算流水号的过程中就应该保存计算出来的流水号是唯一的也是必要的,要不然,计算出新流水号之后,利用这个流水号在其它表添加新记录的时候才发现流水号已经重复了,那就更麻烦了,特别是Web程序
远远小于几个用户同时操作一个事件的间隔
换句话说 第一个用户点击按钮,按钮计算编号的时间
是<<<<<<<< 另外一个用户点击按钮之间的这一段时间
所以担心是没有必要的,自动编号方法很多也没见过出过错,然而加唯一索引也是必要的
CREATE PROCEDURE Sp_bh
@table varchar(20)
AS
/*
--------------------------------------------------------
--返回表的编号,四位流水号
-------------------------------------------------------
*/
Declare @str1 varchar(20),@str2 varchar(20), @str_ret varchar(20)
Declare @num intset @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2)
select @str2=max(编号) from @table where 编号 like @str1+'____'if @str2 is Null OR ltrim(rtrim(@str2))=''
set @str2='0000'set @str2=right(@str2,4)
set @num=cast(@str2 as int)
set @num=@num+1
set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
set @str_ret=@str1+@str2select @str_retGO
为什么我增加一输入参数@table却通不过语法检查,这是为什么呀?
提示为“必须增加变量@table"
@table varchar(20) )
AS
null,'0409' || '0001',
to_number(t.glide)+1)
from table1 t
where substr(t.glide,0,4) like '0409'