当前位置: 代码迷 >> SQL >> 急如律令 sql好手看下帮顶有分
  详细解决方案

急如律令 sql好手看下帮顶有分

热度:55   发布时间:2016-05-05 11:44:25.0
急急如律令 sql高手看下帮顶有分
作息编号
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
  相关解决方案