--生成流水号--创建测试表 create table test(id varchar(18), --流水号,日期(8位)+时间(4位)+流水号(4位) name varchar(10) --其他字段 )go --创建生成流水号的触发器 create trigger t_insert on test INSTEAD OF insert as declare @id varchar(18),@id1 int,@head varchar(12) select * into #tb from inserted set @head=convert(varchar,getdate(),112)+replace(convert(varchar(5),getdate(),108),':','') select @id=max(id) from test where id like @head+'%' if @id is null set @id1=0 else set @id1=cast(substring(@id,13,4) as int) update #tb set @id1=@id1+1 ,id=@head+right('0000'+cast(@id1 as varchar),4) insert into test select * from #tb go --插入数据,进行测试 insert into test(name) select 'aa' union all select 'bb' union all select 'cc'--修改系统时间,再插入数据测试一次 insert into test(name) select 'aa' union all select 'bb' union all select 'cc'--显示测试结果 select * from test --删除测试环境 drop table test/*--测试结果 id name ------------------ ---------- 2004022720430001 aa 2004022720430002 bb 2004022720430003 cc 2004022720430004 aa 2004022720430005 bb 2004022720430006 cc(所影响的行数为 6 行) --*/
--以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。 --创建得到当前日期的视图 CREATE VIEW v_GetDate AS SELECT dt=CONVERT(CHAR(6),GETDATE(),12) GO--得到新编号的函数 CREATE FUNCTION f_NextBH() RETURNS char(12) AS BEGIN DECLARE @dt CHAR(6) SELECT @dt=dt FROM v_GetDate RETURN( SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK) WHERE BH like @dt+'%') END GO--在表中应用函数 CREATE TABLE tb( BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(), col int)--插入资料 INSERT tb(col) VALUES(1) INSERT tb(col) VALUES(2) INSERT tb(col) VALUES(3) DELETE tb WHERE col=3 INSERT tb(col) VALUES(4) INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)--显示结果 SELECT * FROM tb /*--结果 BH col ------------------- ----------- 050405000001 1 050405000002 2 050405000003 4 050405000004 14 --*/
create function f_str() returns varchar(16) as begin declare @s varchar(16) select @s = max( id ) from ta where left(id,8) = convert(char(8),getdate(),112) if @s is null set @s = convert(char(8),getdate(),112)+'001' else set @s = left(@s,8) + right('000'+ ltrim(cast(right(@s,3) as int) + 1),3) return @s end gocreate table ta(id varchar(16) default dbo.f_str(),col int) go insert into ta values(default,100) insert into ta values(default,100) insert into ta values(default,100) insert into ta values(default,100)select * from ta drop table tadrop function f_str/* id col ---------------- ----------- 20081019001 100 20081019002 100 20081019003 100 20081019004 100 */
2、缺省
3、instead of trigger
create table test(id varchar(18), --流水号,日期(8位)+时间(4位)+流水号(4位)
name varchar(10) --其他字段
)go
--创建生成流水号的触发器
create trigger t_insert on test
INSTEAD OF insert
as
declare @id varchar(18),@id1 int,@head varchar(12)
select * into #tb from inserted
set @head=convert(varchar,getdate(),112)+replace(convert(varchar(5),getdate(),108),':','')
select @id=max(id) from test where id like @head+'%'
if @id is null
set @id1=0
else
set @id1=cast(substring(@id,13,4) as int)
update #tb set @id1=@id1+1
,id=@head+right('0000'+cast(@id1 as varchar),4)
insert into test select * from #tb
go
--插入数据,进行测试
insert into test(name)
select 'aa'
union all select 'bb'
union all select 'cc'--修改系统时间,再插入数据测试一次
insert into test(name)
select 'aa'
union all select 'bb'
union all select 'cc'--显示测试结果
select * from test
--删除测试环境
drop table test/*--测试结果
id name
------------------ ----------
2004022720430001 aa
2004022720430002 bb
2004022720430003 cc
2004022720430004 aa
2004022720430005 bb
2004022720430006 cc(所影响的行数为 6 行)
--*/
--创建得到当前日期的视图
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
GO--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(12)
AS
BEGIN
DECLARE @dt CHAR(6)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like @dt+'%')
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)--显示结果
SELECT * FROM tb
/*--结果
BH col
------------------- -----------
050405000001 1
050405000002 2
050405000003 4
050405000004 14
--*/
returns varchar(16)
as
begin
declare @s varchar(16)
select @s = max( id ) from ta where left(id,8) = convert(char(8),getdate(),112)
if @s is null
set @s = convert(char(8),getdate(),112)+'001'
else
set @s = left(@s,8) + right('000'+ ltrim(cast(right(@s,3) as int) + 1),3)
return @s
end
gocreate table ta(id varchar(16) default dbo.f_str(),col int)
go
insert into ta values(default,100)
insert into ta values(default,100)
insert into ta values(default,100)
insert into ta values(default,100)select * from ta
drop table tadrop function f_str/*
id col
---------------- -----------
20081019001 100
20081019002 100
20081019003 100
20081019004 100
*/