求助:sql server可不可以实现自动编号

iamyg 2008-06-06 09:51:54
就是自动生成 日期+流水号 的编号
记得看过说用触发器可以自动生成 200806060001这样的编号
请哪位大牛指导一二...不胜感激
...全文
68 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
火星求索 2008-06-06
  • 打赏
  • 举报
回复

-------------------------实例
--drop table t
--go
--建表
create table t (coding varchar(20) not null,a int)
go
--新建个函数
--drop function [dbo].[AutoFollowExamCode]
create function [dbo].[AutoFollowExamCode](@date datetime)
returns varchar(13)
as
begin
declare @str varchar(13)
select @str=isnull(max(coding),'20'+right(datename(year,@date),2)+right('0'+right(datepart(month,@date),2),2)+right('0'+datename(day,@date),2)+'00000')
from t
where coding like '20'+right(datename(year,@date),2)+right('0'+right(datepart(month,@date),2),2)+right('00'+datename(day,@date),2)+'%'
select @str=left(@str,8)+right('00000'+convert(varchar(5),convert(int,right(@str,5))+1),5)
return (@str)
end
--把表的默认值设置成[dbo].[AutoFollowExamCode](getdate())
--测试
go
--加约束
ALTER TABLE dbo.t ADD CONSTRAINT
DF_t_coding DEFAULT [dbo].[AutoFollowExamCode](getdate()) FOR coding
--删除测试数据
go
--
declare @i int
select @i=8
while @i>0
begin
insert into t(a) values ('1')
select @i=@i-1
end
--显示结果
go
select * from t
go
drop function AutoFollowExamCode
go
drop table t
iamyg 2008-06-06
  • 打赏
  • 举报
回复
谢谢,非常感谢,不胜感激
火星求索 2008-06-06
  • 打赏
  • 举报
回复
可以
liangCK 2008-06-06
  • 打赏
  • 举报
回复
--生成流水号

--创建测试表
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 行)
--*/
liangCK 2008-06-06
  • 打赏
  • 举报
回复
--以下代码生成的编号长度为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
--*/

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧