翻译整理:IT者  : 作者:qicaihuochai


<script type="text/javascript"> </script> <script src="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E6%A1%A3/%E7%9F%A5%E8%AF%86%E4%B9%8B%E5%AE%B6/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7%E7%9A%84%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F%EF%BC%9F%20-%20IT%E8%80%85_files/show_ads.js" type="text/javascript"> </script>

我的数据库是SQL2000,我想将一个字段设置成自动编号,并且自动编号的格式为:0001.即第一条记录的编号是:0001,那么自动编号的下一条记录的编号就是:0002.



并且假如在中间删除一条数据记录不影响其他编号的变化。即,记录编号从0001到1000,删除0050,其他的号码不会改变。



这个问题我曾经问过很多人都没有回答,希望各位专家,老手给与解答!!



谢谢!!



网友回复:create table ddd(id int identity(1,1)......




这样就行


网友回复:然后用于显示时再进行转换



select right('000000' ltrim(id),4)


网友回复:为什么要在数据库中设置呢,在读取的时候设置不可以吗?



---例子


id 是自增列



select right('0000' id,4) 这种形式不可以吗?


网友回复:第二种方法:



ID 为 char(4)



在表上装触发器 AFTER或INSTEAD OF都行





网友回复:也可以把自增列的起始值设为 10000 ,然后在读取的时候 left(id,4) 这样也可以, 对于你说的那个记录编号从0001到1000,删除0050,其他的号码不会改变,这个是什么意思没有明白


 



网友回复:我是这个意思:自动编号前面是0,后面的数字是自动编号,另外举个例子就是 :A001,下一个编号就是:A002,第一百个编号就是:A100



我的数据库已经建好了,怎么再使用触发器啊?触发器代码怎么写?麻烦具体告知,我是初学者。谢谢!!


网友回复:这样不行


自动编号,只能是int数据类型



当 titles 表更改时,下例将电子邮件发送给指定的人员 (MaryM)。


USE pubs 
 
IF EXISTS (SELECT name FROM sysobjects 
 
WHERE name = 'reminder' AND type = 'TR') 
 
DROP TRIGGER reminder 
 
GO 
 
CREATE TRIGGER reminder 
 
ON titles 
 
FOR INSERT, UPDATE, DELETE 
 
AS 
 
EXEC master..xp_sendmail 'MaryM', 
 
'Don''t forget to print a report for the distributors.' 
 
GO


网友回复:假如你想要 A001 这种形式,也可以在读取的时候做啊, select 'A' right('000' id,3) -- 这里的id是自增列





别外你的数据库已经建好了,你是怎么建的?


网友回复:----例子



select 自动编号='A' right('000' rtrim(1),3)



/* 结果



自动编号


-------


A001



*/


网友回复:我的数据库不是用程序代码写的是从企业治理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!


网友回复:LZ要求是自动生成的吧?




网友回复:leo_lesley



你的方法能够编号到A100吗?



假如可以那我就试试!!



代码怎么添加,添加在哪里啊??



我的数据库不是用程序代码写的是从企业治理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!


网友回复:用计算列实现吧。就是多出一个列来。


网友回复:你的方法能够编号到A100吗? 这个是什么意思没明白




你的表是怎么建的,只要主键是自增列,在读取的时候select 自动编号='A' right('000' rtrim(自增列),3) from 表名 这样就可以了


网友回复:看下面方法行不行,用到计算列实现


Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





CREATE TABLE [dbo].[tb1] (

    [autoid] [int] IDENTITY (1, 1) NOT NULL ,

    [myid] AS (right(str((10000   [autoid])),4)) ,

    [mytext] [char] (10) 

)





insert into tb1 (mytext) values('qqqq')

insert into tb1 (mytext) values('bbbbb')

insert into tb1 (mytext) values('fffff')

insert into tb1 (mytext) values('tttt')



select * from tb1



/*

autoid      myid     mytext     

----------- -------- ---------- 

          1 0001     qqqq      

          2 0002     bbbbb     

          3 0003     fffff     

          4 0004     tttt      



(所影响的行数为 4 行)

*/


网友回复:楼上的兄弟,你的方法似乎不能让0005自动生成编号!!



不过还是感谢你的支持!!



谢谢!!


网友回复:


使用自增就应该可以了



你若想生成A 0000的形式


也可新加一列,并自动编码,


Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





--drop table tes

--go

--建表

create table tes (coding varchar(20) not null,a int)

go

--新建个函数

--drop function [dbo].[AutoGetCoding]

create function [dbo].[AutoGetCoding](@date datetime)

returns varchar(5)

as

begin

declare @str varchar(5)

select @str=isnull(max(coding),'A0000') 

from tes

select @str=left(@str,1) right('0000' convert(varchar(4),convert(int,right(@str,4)) 1),4)

return (@str)

end

--把表的默认值设置成[dbo].[AutoFollowExamCode](getdate())

--测试

go

--加约束

ALTER TABLE dbo.tes ADD CONSTRAINT

DF_t_coding DEFAULT [dbo].[AutoGetCoding](getdate()) FOR coding

--删除测试数据

go

--

declare @i int

select @i=8

while @i>0

begin

insert into tes(a) values ('1')

select @i=@i-1

end

--显示结果

go

select * from tes

/*coding               a

-------------------- -----------

A0001                1

A0002                1

A0003                1

A0004                1

A0005                1

A0006                1

A0007                1

A0008                1

*/