存贮过程功能生成流水号,输出结果不对,请帮助看一下!

@信心 2011-10-30 06:20:20
(mssql200环境下)存贮过程功能生成流水号2011113000001,
在查询分析窗口执行:
exec getnumber 18,'20111230','1234'
结果显示:
10017 2011-10-30 18:00:59.733
10018 2011-10-30 18:01:12.153
10019 2011-10-30 18:01:14.763
10020 2011-10-30 18:01:15.513
在查询分析运行结果并为想要的2011113000001,不知道哪些有问题?????


----代码如下:

CREATE PROCEDURE [dbo].[GetNumber]
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS
BEGIN TRAN T1
DECLARE @CurrentValue INT
INSERT INTO AUTOID (CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
SELECT * FROM AUTOID WITH (TABLOCKX)
waitfor delay '00:00:05'

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

GO

其中表autoid 有两个字段一个是 id(identity )另一个是 createtime 存当前时间。

...全文
176 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2011-10-30
  • 打赏
  • 举报
回复
如果程序运行时间不长,何不考虑用事务.
@信心 2011-10-30
  • 打赏
  • 举报
回复
谢谢各位建议,关键其中有一个锁 防止并发是否可以?
SELECT * FROM AUTOID WITH (TABLOCKX)
中国风 2011-10-30
  • 打赏
  • 举报
回复
单号记数器这样用

Create table AUTOID(ID int identity primary key,Date datetime,NextNumber int)

go
CREATE PROCEDURE [dbo].[GetNumber]
@length INT,
@currdate datetime,
@RegularVal NVARCHAR(50) output
AS
BEGIN TRAN T1
declare @NextNumber int
select @NextNumber=NextNumber from AUTOID with(rowlock,holdlock) where datediff(d,Date,@currdate)=0

if @NextNumber is null
begin
set @NextNumber=1
insert into AUTOID values(@currdate,2)
end
else
begin
update AUTOID with(rowlock,holdlock) set @NextNumber=NextNumber=NextNumber+1 where datediff(d,Date,@currdate)=0
end
SET @RegularVal=convert(varchar(8),@currdate,112) + RIGHT(REPLICATE(0,@length) + rtrim(@NextNumber), @length)
COMMIT TRAN T1
go

declare @RegularVal NVARCHAR(50)
exec [GetNumber] @length=5,@currdate='20111130',@RegularVal=@RegularVal output
@信心 2011-10-30
  • 打赏
  • 举报
回复
我刚刚学习存贮过程,代码中存在问题多多。
主要功能多用户并发时生成不重复流水号。上面代码也是用别人改的。
中国风 2011-10-30
  • 打赏
  • 举报
回复
看错结果

存贮过程功能生成流水号2011113000001,
在查询分析窗口执行:
exec getnumber 18,'20111230','1234'

传的长度不对
中国风 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 roy_88 的回复:]

SQL code
CREATE PROCEDURE [dbo].[GetNumber]
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS

BEGIN TRAN T1
DECLARE @CurrentValue INT
INSERT INTO AUTOID (CreateTi……
[/Quote]

改改用left(@currdate,6)


CREATE PROCEDURE [dbo].[GetNumber]
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS

BEGIN TRAN T1
DECLARE @CurrentValue INT
INSERT INTO AUTOID (CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
SELECT * FROM AUTOID WITH (TABLOCKX)
waitfor delay '00:00:05'

SET @RegularVal=left(@currdate,6) + RIGHT(REPLICATE(0,@length) + CAST((@CurrentValue) as NVARCHAR), @length)
COMMIT TRAN T1
中国风 2011-10-30
  • 打赏
  • 举报
回复
CREATE PROCEDURE [dbo].[GetNumber]  
@length INT,
@currdate NVARCHAR(8),
@RegularVal NVARCHAR(50) output
AS

BEGIN TRAN T1
DECLARE @CurrentValue INT
INSERT INTO AUTOID (CreateTime) VALUES(Getdate())-- 种子表名这个表就两个字段,一个自增字段,一个是时间
SET @CurrentValue=@@Identity
SELECT * FROM AUTOID WITH (TABLOCKX)
waitfor delay '00:00:05'

SET @RegularVal=convert(varchar(8),@currdate,112) + RIGHT(REPLICATE(0,@length) + CAST((@CurrentValue) as NVARCHAR), @length)
COMMIT TRAN T1
--小F-- 2011-10-30
  • 打赏
  • 举报
回复
你的日期转换为什么是这样的??
可以直接
convert(varchar(10) , 时间字段, 112 )+right(rtrim('000000'+ltrim(id)),6)就可以实现了

怎么写得这么麻烦?
中国风 2011-10-30
  • 打赏
  • 举报
回复
种子表名这个表就两个字段,一个自增字段,一个是时间

----
这个表这样用每天一条记录

ID 日期 NextNumber
-晴天 2011-10-30
  • 打赏
  • 举报
回复
直接用种子表插入的数据就能得到你的那个流水号了吧.
中国风 2011-10-30
  • 打赏
  • 举报
回复
这样效率太低了,建议用
http://blog.csdn.net/roy_88/article/details/1424370
唐诗三百首 2011-10-30
  • 打赏
  • 举报
回复
你的@RegularVal是output的参数,要这么调用.

declare @r nvarchar(50)

exec getnumber 18,'20111230',@r output

select @r

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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