流水号生成?

CRMNet 2010-02-24 04:15:55
sqlserver2000,asp.net,用程序插入记录,每条记录有一个唯一的流水号,例如201002030001;
用sqlserver2000做生成流水号,还是用C#? 保证并发的时候不重复
...全文
1634 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
www52rsNet 2011-11-12
  • 打赏
  • 举报
回复
CRMNet 2010-03-08
  • 打赏
  • 举报
回复
Linux7985是sql2005吧,我这里是sql2000
CRMNet 2010-03-04
  • 打赏
  • 举报
回复
Linux7985是sql2005吧,我这里是sql2000
烈火蜓蜻 2010-02-28
  • 打赏
  • 举报
回复
    INSERT INTO  种子表名(CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
DELETE FROM 种子表名 WITH (READPAST)
烈火蜓蜻 2010-02-27
  • 打赏
  • 举报
回复
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[GetSerialNumber]
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS
BEGIN TRY
BEGIN TRAN T1

DECLARE @CurrentValue INT

INSERT INTO 种子表名(CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
DELETE FROM SequenceItfSeqCode20 WITH (READPAST)

SET @RegularVal=@currdate + RIGHT(REPLICATE(0,@length) + CAST((@CurrentValue) as NVARCHAR), @length)

COMMIT TRAN T1
END TRY
BEGIN CATCH
ROLLBACK TRAN T1
END CATCH
烈火蜓蜻 2010-02-27
  • 打赏
  • 举报
回复
引用 14 楼 linux7985 的回复:
建一个种子表,这个种子表就一个字段就是一个自增ID,然后加上日期啊,前缀啊,后缀啊等等就可以实现生成流水号了,这样最简单


附上我的代码吧,
这样的流水号,产生,可以承受很大的访问压力

-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[GetSerialNumber]
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS
BEGIN TRY
BEGIN TRAN T1

DECLARE @CurrentValue INT

INSERT INTO 种子表名(CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
DELETE FROM SequenceItfSeqCode20 WITH (READPAST)

SET @RegularVal=@currdate + RIGHT(REPLICATE(0,@length) + CAST((@CurrentValue) as NVARCHAR), @length)

COMMIT TRAN T1
END TRY
BEGIN CATCH
ROLLBACK TRAN T1
END CATCH
lmpression 2010-02-27
  • 打赏
  • 举报
回复
引用 26 楼 hetl_1985 的回复:
获取当前的日期再+1,每生成一个就+1,一直这样下去



这样应该是最简单的了!
codeingsky 2010-02-27
  • 打赏
  • 举报
回复
我的做法基本跟14楼 Linux7985一样! 表述不清楚...


支持 Linux7985
悔说话的哑巴 2010-02-26
  • 打赏
  • 举报
回复
获取当前的日期再+1,每生成一个就+1,一直这样下去
xi_ye 2010-02-26
  • 打赏
  • 举报
回复
写一个存储过程。
再在另一个需要生成流水号的存储过程里调用。

ALTER PROCEDURE [dbo].[sp_Sys_CreatId](
@tbName VarChar(40), --传入表名
@id bigint OUTPUT) --接收生成的id
AS
declare @type NvarChar(50)
declare @maxId bigint
declare @lastDate NvarChar(10)
declare @nowDate NvarChar(10)
BEGIN TRAN
Declare @strYear varchar(4),@strMonth varchar(2),@strDay varchar(2)
Set @strYear = DATEPART(year, GETDATE())
Set @strMonth = DATEPART(month, GETDATE())
Set @strDay= DATEPART(day, GETDATE())
if (Len(@strMonth) = 1)
Set @strMonth = '0' + @strMonth
if(Len(@strDay) = 1)
Set @strDay = '0' + @strDay
Set @nowDate = @strYear + @strMonth+@strDay --获取到当前时间
IF(EXISTS(SELECT * FROM tbSys_CreateID WHERE sys_TypeNamestr =@tbName))
BEGIN
select @type=sys_TypeNamestr,@maxId=sys_MaxIdstr,@lastDate=sys_Timedate from tbSys_CreateID where sys_TypeNamestr=@tbName;

if(@lastDate=@nowDate) --同一天 加1
set @maxId=@maxId+1
else --不同一天 恢复100001
set @maxid=100001
set @lastDate=@nowDate
BEGIN
update tbSys_CreateID set sys_MaxIdstr=@maxId,sys_Timedate=@lastDate where sys_TypeNamestr=@type --更新表
End
End
else
BEGIN
insert into tbSys_CreateID(sys_TypeNamestr,sys_MaxIdstr,sys_Timedate) values(@tbName,100001,@nowDate)
set @maxid=100001
End
set @id=Cast((@nowDate+cast(@maxId as varchar(6))) AS bigint)*123 --返回值

NeedRollBack:
if @@error>0
rollback tran
else
commit tran


生成流水号表的储存过程里引用
ALTER PROCEDURE [dbo].[tbSupplier_Info_ADD]
@supp_CompanyNamestr varchar(100),----这里的流水号就不用写了。
AS
declare @id bigint ---这里开始引用生成流水号的存储过程
exec sp_Sys_CreatId 'tbUser_Info',@id out
INSERT INTO [tbSupplier_Info](
[supp_Idstr],[supp_CompanyNamestr]
)VALUES(
@id,@supp_CompanyNamestr)
RubbyZK 2010-02-26
  • 打赏
  • 举报
回复
个人觉得还是在数据库处理比较好。
wanghui0380 2010-02-26
  • 打赏
  • 举报
回复
如果配合
作业调度效果也许更好点,作业调度在每天0点自动清理辅助表,并重置编号的话

编码编写量会少很多

不过我稍微有点疑问,如果客户在0点时作业运行期间访问,系统会不会有问题??

期待sql高手解答
wanghui0380 2010-02-26
  • 打赏
  • 举报
回复
没啥问题,使用联合主键即可

最好有另外一张辅助表,来暂存当天已用的号
beibeisay88 2010-02-26
  • 打赏
  • 举报
回复
引用 14 楼 linux7985 的回复:
建一个种子表,这个种子表就一个字段就是一个自增ID,然后加上日期啊,前缀啊,后缀啊等等就可以实现生成流水号了,这样最简单


觉得不错
Ki1381 2010-02-26
  • 打赏
  • 举报
回复
另建一表,包含一个自增长类型。

每次请求生成一个流水号时,首先往这个表里插记录,同时用select @@IDENTITY直接获取当前的ID值。接下来就很简单了,根据LZ需要的规格产生一个流水号。

如果系统不是7*24的话,可以在非营业时段truncate这个表,那么第二天就又从1开始
gaowenzhen 2010-02-26
  • 打赏
  • 举报
回复
把数据库ID数设大他有自动加1的功能来当流水号不行吗,
zzxap 2010-02-26
  • 打赏
  • 举报
回复
用guid。。。。。。。。。。。。
CGabriel 2010-02-26
  • 打赏
  • 举报
回复
引用 7 楼 crmnet 的回复:
引用 4 楼 xinsiyu2008 的回复:保证并发的时候不重复 感觉还是在数据层好吧。写成事务好点儿,插入本身就排除了并发。

多个来源操作的插入不能排除并发...


你觉得并发这么简单且常见的问题,数据库居然会没有处理好么
cjcgy 2010-02-26
  • 打赏
  • 举报
回复
系统时间+客户端IP,
混合起来?

应该不会重复吧。

加载更多回复(15)
功能包含标注、文本、路径、颜色、画板、包装、拼板、设计、输出和效果等大类,常用功能如:标注横尺寸,标注纵尺寸,标注尺寸,轻松画包装1,轻松画包装2,天地盖盒子,绘制手提袋,绘制外箱,生成出血线,文本段落分行,段落行合并,文本段落转换,单行拆单字,字体转曲,大小写转换,查找专色,两者换位,选择导出-PSD,导出jpg,选择导出jpg,选择增强,随机填色,圆角插件,锚点分割路径,等分路径,建立等分圆,测量路径长度,点到点连线,节点延伸,解锁全部对象,统一画板尺寸,当前画板矩形,全部画板矩形,垂直两分,水平两分,插入页码等,多图层转多画板,页面适配对象,裁切标记,印前角线,一键拼版,自动拼版,阵列复制,标记线生成,创建参考线,打开多页PDF,置入PDF多页面,条形码及二维码,色标生成器,移除叠印属性,移除非纯黑叠印,解散全部群组,批量替换链接图,链接文件打包,全部颜色转黑,查找白色叠印,删除所有蒙版,正则编辑文本,流水号生成器,统计所选对象,。 作者会持续更新,如果您有需要的功能,可以给作者留言,作者闲时进行制作。欢迎下载使用,安装完毕之后,在窗口菜单>扩展>知了插件,打开即可使用。

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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