作息编号
2010831ZX001
2010831ZX002
前面是时间 20100831 当前日期
后面是zx 固定
在后面是001 002 加一
在插入的时候如何插入2010831ZX003 这是自动的 不是人为的输入
如插入20101122ZX001
------解决方案--------------------
什么数据库?
取最后 3位,转换为数字型 ,再+1,与前面9位连接
------解决方案--------------------
declare @maxId varchar(512)
set @maxId = '2010831ZX001'; --通过查询获取当前表中的最大ID
declare @curId varchar(3);
set @curId =convert(varchar(3),convert(int,right(@maxId,3))+1)
select CONVERT(varchar(12) , getdate(), 112 ) +'ZX'+ REPLICATE('0', 3 - LEN(@curId))[email protected]
------解决方案--------------------
可以使用触发器来实现,但楼上的方法会导致并发冲突,即如果两个SESSION同时插入数据时,会取得相同的 当前表中的最大ID
在目前的计算机系统,可以考虑是否可以直接使用系统编号?
------解决方案--------------------
产不产生并发,与是否是CS结构无关。
你的环境中会不会有两个以上用户同时会进行这个插入操作。
建议还是直接使用系统自身提供的IDENTITY来生成主键。而如果一定需要显示这个 作息编号 则完全可以在视图中或者程序中来实现。
------解决方案--------------------
一般要锁表,产生编号后,替换再写回表,UNLOCK 表
SELECT
convert(VARCHAR,GETDATE(),112)+'ZX'+RIGHT('000'+convert(varchar(3),convert(int,right('20100831ZX001',3))+1),3)
------解决方案--------------------
锁表不好控制 控制不好会造成死锁 顶7楼 程序产生这个 作息编号 最优!
------解决方案--------------------
用程序产生一样涉及到并发问题
------解决方案--------------------
select
case when b.nowDate=left(a.buy_code,8)
then left(a.buy_code,10)+
(case len(convert(varchar(3),(convert(int,right(a.buy_code,3))+1)))
when 1 then '00'+convert(varchar(3),(convert(int,right(a.buy_code,3))+1))
when 1 then'0'+convert(varchar(3),(convert(int,right(a.buy_code,3))+1))
else convert(varchar(3),(convert(int,right(a.buy_code,3))+1)) end
)
else b.nowDate+'ZX001' end as code
from (select max(buy_code) as buy_code from fam_print_buy) a,
(select Convert(varchar(36),getdate(),112) as nowDate)b
------解决方案--------------------
select
case when b.nowDate=left(a.buy_code,8)
then left(a.buy_code,10)+
(case len(convert(varchar(3),(convert(int,right(a.buy_code,3))+1)))
when 1 then '00'+convert(varchar(3),(convert(int,right(a.buy_code,3))+1))
when 1 then'0'+convert(varchar(3),(convert(int,right(a.buy_code,3))+1))
else convert(varchar(3),(convert(int,right(a.buy_code,3))+1)) end
)
else b.nowDate+'ZX001' end as code
from (select max(buy_code) as buy_code from fam_print_buy) a,
(select Convert(varchar(36),getdate(),112) as nowDate)b