一个关于SQLserver数据项的问题?
该数据项的生成规则是:
Syymmddxxxx
S-签收单
yymmdd--年月日
xxxx--4位当天的流水号0001-9999(过了一天后又重新从0001开始)
该数据项是主键,如何插入才能保证它的唯一性。
问题点数:50、回复次数:8Top
1 楼pengji(彭乃超)回复于 2002-03-29 16:42:54 得分 0
另外做一个保持当天的流水号!或者用写本地文件的办法保存当天流水号!前一种方法可以使用数据库的定时运行的特性,定时清零!Top
2 楼lyxinfo(雒)回复于 2002-03-29 17:16:40 得分 0
作一个表,两个字段,Genid (id int,Pdate datetime),只有一条记录;
使用存储过程得到编号,这样就肯定不会重复了。
生成编号的主要语句
update Genid
set id = right('000'+ rtrim(convert(varchar,isnull((select id from Genid where datediff(dd,Pdate,getdate()) = 0),0) + 1)),4)
select id //这个就是递增后的编号了。
from genid
Top
3 楼lyxinfo(雒)回复于 2002-03-29 18:34:39 得分 0
哦,Update要这样。
句
update Genid
set id = right('000'+ rtrim(convert(varchar,isnull((select id from Genid where datediff(dd,Pdate,getdate()) = 0),0) + 1)),4),
pdate = case when datediff(dd,pdate,getdate()) <> 0 then getdate() else pdate endTop
4 楼lyxinfo(雒)回复于 2002-03-29 18:53:22 得分 0
唉又错,给个完整的测试:
create table genid
(id int primary key,
Pdate datetime
)
drop procedure Pgenid
go
create procedure PGenid
as
begin
update Genid
set id = (isnull((select id from Genid where datediff(dd,Pdate,getdate()) = 0),0) + 1),
pdate = (case when datediff(dd,pdate,getdate()) <> 0 then getdate() else pdate end)
select right('000'+ rtrim(convert(varchar,id)),4) from Genid
end
drop table genid
insert genid
values
(1,'2000-1-1')
exec Pgenid
存储过程返回的结果集就是流水号,也可以用OUT的参数了,基本方法就是这样了。Top
5 楼hojialiang(jialiang)回复于 2002-03-30 11:22:31 得分 0
create table genid
(id int primary key,
Pdate datetime
)
drop procedure Pgenid
go
create procedure PGenid
as
begin
update Genid
set id = (isnull((select id from Genid where datediff(dd,Pdate,getdate()) = 0),0) + 1),
pdate = (case when datediff(dd,pdate,getdate()) <> 0 then getdate() else pdate end)
select right('000'+ rtrim(convert(varchar,id)),4) from Genid
end
drop table genid --->这句放这里干什么?
insert genid
values
(1,'2000-1-1')
exec Pgenid
存储过程返回的结果集就是流水号,也可以用OUT的参数了,基本方法就是这样了。Top
6 楼lyxinfo(雒)回复于 2002-03-30 13:08:23 得分 0
呵呵,见笑,那里是测试得时候删除存储过程的,用不到,一下全拷过去了,本来想说明一下得,但是不能连续回三次以上。
只有两个Create,再加写入一个种子的Insert是有用的。Top
7 楼hojialiang(jialiang)回复于 2002-03-30 15:06:02 得分 0
太谢谢lyxinfo()了,给你50分。Top
8 楼lyxinfo(雒)回复于 2002-03-30 15:16:08 得分 50
呵呵,客气客气!Top




