菜鸟求助:如题,我要实现,采购主表中的,采购单号字段,自动按年月,编号,格式为:"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
说明:下面,代码中出现的"记录顺序"是表的主键,自动编号;面“采购单号”为要生成的增加记录,自动编号字段(文本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
解决方案 »
- 大家帮忙想下这个SQL语句。。。
- 很郁闷的问题
- 一简单的有关数据库的权限问题!!!
- 新学SQL,不知道这个怎么实现
- 安装SQL SERVER2008出现的问题
- 像 google、baidu 他们的搜索引擎 用的数据库是什么? SQLSERVER ? Oracle?
- SQL server CLR C# 找不到类型
- 删除操作,请指教!
- 两表结构相同,数据也基本一致,只有极小部份不同,怎么样才能把不一致的数据所在行快速列出来
- vfp中如何使用象@prow()+1,pcol()+1 say " sdss"命令
- 请教问题——从视图向表image字段插入null提示int和image不兼容
- 关于Left Join极慢的问题!!求高手指点!!!!!
消息 102,级别 15,状态 1,过程 CK_Insert,第 58 行
')' 附近有语法错误。是什么意思?
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
请教一下,按你的改法,创建触发器成功了!但是我在插入数据的时候提示:
消息 2627,级别 14,状态 1,第 1 行
违反了 UNIQUE KEY 约束 'IX_采购主表'。不能在对象 'dbo.采购主表' 中插入重复键。
语句已终止。
怎么个一回事?
“采购主表”的表结构是: “记录顺序”INT 自动编号型 并且是唯一值,主键! 采购单号,varchar(16) 目的,是在“采购主表”插入记录时,生成 “采购单号”