菜鸟求助:如题,我要实现,采购主表中的,采购单号字段,自动按年月,编号,格式为:"CK1207-0001" 次月,重新从“CK1208-0001”开始编号,下面是我在网上找的例子,跟据需要,改动部分,但入到下面,发现不对!本来是菜鸟虚心向各位求助!我朋友们帮忙改动一下!要如何完善这个触发器!
说明:下面,代码中出现的"记录顺序"是表的主键,自动编号;面“采购单号”为要生成的增加记录,自动编号字段(文本16字符)!create TRIGGER CK_Insert 
   ON  采购主表 
   After INSERT 
AS 
BEGIN 
 declare @oid2 nvarchar(50)
 declare @oid nvarchar(50)
 declare @month nvarchar(2)
 declare @year nvarchar(2)
 declare @ym nvarchar(4)
 set @month=month(getdate())
 if len(@month)=1
 set @month='0'+@month --使月份为两位长
 set @year=right(convert(nvarchar,year(getdate())),2)
 set @ym=@year+@month --组成年月字符串
 
--编号格式为CK1207-0001
 if exists(select * from 采购主表)
 begin
     select  top 1 @oid2=采购单号 from 采购主表 order by 记录顺序 desc  --获取最后一条的单据编号,用自动编字段倒排序
 end
 else 
 begin
     set @oid2='CK'+@ym+'-'+'0000' --没有记录是默认为今天
 end
 
--订单不是本月的,重新开始一个新的订单流水号
 if convert(nvarchar,left(@oid2,6))<>@ym
 begin
 --用本月的年月号开始
     set @oid2='CK'+@ym+'-'+'0000'
 end
 
declare @str nvarchar(50) --生成临时单号
 
set @str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --订单号加一
 while (4-len(@str)>0)
 begin
      set @str='0'+@str    
 end
 set @oid2='CK'+@ym+'-'+@str
 --print @oid2
 
--如果该订单好已经存在,则重新获取新的订单号
 while exists(select * from 采购主表 where 采购单号=@oid2)
 begin
     
     set @str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --订单号加一
     while (4-len(@str)>0)
     begin
          set @str='0'+@str    
     end
     set @oid2='CK'+@ym+'-'+@str
 --    print @oid2
 end
 
set @oid=convert(nvarchar,@oid2)
update 采购主表 set 采购单号=@oid where 记录顺序=(select max(记录顺序) from 采购主表)
go

解决方案 »

  1.   

    执行的时候SQL提示
    消息 102,级别 15,状态 1,过程 CK_Insert,第 58 行
    ')' 附近有语法错误。是什么意思?
      

  2.   


    create TRIGGER CK_Insert  
      ON 采购主表  
      After INSERT  
    AS  
    BEGIN   declare @oid2 nvarchar(50)
     declare @oid nvarchar(50)
     declare @month nvarchar(2)
     declare @year nvarchar(2)
     declare @ym nvarchar(4)
     set @month=month(getdate())
     if len(@month)=1
     set @month='0'+@month --使月份为两位长
     set @year=right(convert(nvarchar,year(getdate())),2)
     set @ym=@year+@month --组成年月字符串
     
    --编号格式为CK1207-0001
     if exists(select * from 采购主表)
     begin
      select top 1 @oid2=采购单号 from 采购主表 order by 记录顺序 desc 
      --获取最后一条的单据编号,用自动编字段倒排序
     end
     else  
     begin
      set @oid2='CK'+@ym+'-'+'0000' --没有记录是默认为今天
     end
     
    --订单不是本月的,重新开始一个新的订单流水号
     if convert(nvarchar,left(@oid2,6))<>@ym
     begin
     --用本月的年月号开始
      set @oid2='CK'+@ym+'-'+'0000'
     end
     
    declare @str nvarchar(50) --生成临时单号
     
    set @str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --订单号加一
     while (4-len(@str)>0)
     begin
    set @str='0'+@str   
     end
     set @oid2='CK'+@ym+'-'+@str
     print @oid2
     
    --如果该订单好已经存在,则重新获取新的订单号
     while exists(select * from 采购主表 where 采购单号=@oid2)
     begin
        
      set @str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --订单号加一
      while (4-len(@str)>0)
      begin
    set @str='0'+@str   
      end
      set @oid2='CK'+@ym+'-'+@str
     -- print @oid2
     end
     
    set @oid=convert(nvarchar,@oid2)
    update 采购主表 set 采购单号=@oid 
    where 记录顺序=(select max(记录顺序) from 采购主表)
    end
    go
      

  3.   


    请教一下,按你的改法,创建触发器成功了!但是我在插入数据的时候提示:
    消息 2627,级别 14,状态 1,第 1 行
    违反了 UNIQUE KEY 约束 'IX_采购主表'。不能在对象 'dbo.采购主表' 中插入重复键。
    语句已终止。
    怎么个一回事?
      

  4.   


    “采购主表”的表结构是: “记录顺序”INT 自动编号型 并且是唯一值,主键!  采购单号,varchar(16)  目的,是在“采购主表”插入记录时,生成 “采购单号”
      

  5.   

    我写了一个,测试没问题。见我的博客:http://blog.csdn.net/zhazhuzhao/article/details/7756589