表结构
@t(id varchar(20))
GJD-20060712-01-1
GJD-20060712-01-2
...........即字符串'GJD'+'-'+当天日期+'-'+部门编号+'-'+'递增编号'能不能直接在SQL中实现,不写函数
@t(id varchar(20))
GJD-20060712-01-1
GJD-20060712-01-2
...........即字符串'GJD'+'-'+当天日期+'-'+部门编号+'-'+'递增编号'能不能直接在SQL中实现,不写函数
解决方案 »
- “主键是表中的一个或多个字段”怎么理解
- 新手上路:一个简单的问题:怎么删除纪录?(100)
- sql视图的创建
- 数据比对求SQL语句、存储过程或编写思路
- 看了这个问题之后别笑我!我是初学者
- 求"错误3242:设备 ''%1!'' 的文件不是有效的 Microsoft 磁带格式备份集,RESTORE FILELIST操作异常终止."如何解决
- sort order id 到底是个什么东东哦!
- 关于SQL SERVER2000,问题应该很简单,但附近没人帮我,急!
- 急:ntext最大长度可达2G,但为什么我的SQL SERVER中的ntext,text的长度却是128字节(SQL SERVER2000)!
- 创建带分区的表时报错.help!!!
- 如何提高SQL运行效率(一): 如何以最快的速度得到一个数据表或一个SQL选择查询的记录个数?
- 数据库文件不是同时更新的吗?
declare @d1 varchar(2),@d2 varchar(2)
set @d1='01'
set @d2='02'insert into @t
select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-%'insert into @t
select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-%'insert into @t
select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d2+'-'+rtrim(isnull(left(max(id),1),0)+1)
from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d2+'-%'
declare @d1 varchar(2),@d2 varchar(2)
set @d1='01'
--set @d2='02'insert into @t
select 'GJD-'+convert(char(8),getdate(),112)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
from @t where id like 'GJD-'+convert(char(8),getdate(),112)+'-'+@d1+'-%'select * from @t
/*GJD-20060712-01-1
*/
--如果是01部门的话,GJD-20060712-01-1怎样在插入记录的时候递增
insert int @t
select 'GJD-' + convert(varchar(8),getdate(),112) + '-' + (select 部门编号 from tab where ..)
+ cast((select max(right(id , 1)) + 1 from tab ) as varchar(20))
BEGIN
PRINT 'Dropping Procedure SD_GetAutoDocNum'
DROP Procedure SD_GetAutoDocNum
ENDGOPRINT 'Creating Procedure SD_GetAutoDocNum'
GO
CREATE Procedure SD_GetAutoDocNum
/* Param List */
@CLASS char(10),
@OBJECT char(4),
@SECTIONOBJECT char(4),
@COUNT int
ASDeclare
@DocID decimal(18,0), -- 要返回的号码@BEGINCOUNT decimal(18), -- 起始号码
@ENDCOUNT decimal(18), -- 终止号码
@CURRENTCOUNT VARCHAR(18), -- 以字符串形式存储的当前号码
@EXTEBS char(1) -- 内外部给号标志Set @DocID = -1; -- 初始化返回号码If (@COUNT <= 0) -- 判断传入的取号个数不正确
Begin
Goto real_end -- 取号个数不正确,直接返回
End
SELECT
@DocID = 0,
@BEGINCOUNT = CAST(BEGINCOUNT AS decimal(18,0)),
@ENDCOUNT = CAST(ENDCOUNT AS decimal(18,0)),
@CURRENTCOUNT = CURRENTCOUNT
FROM BSNRG WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECTif (@DocID = -1)
Begin
Goto real_end
End-- 为数据库加锁,避免并发时取到重复的号
UPDATE BSNRG SET CURRENTCOUNT = @CURRENTCOUNT WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT-- 如果初始化数据库时将当前号码值0的话即可删除此部分
If ( (@CURRENTCOUNT IS NULL) OR (@CURRENTCOUNT = '') ) -- 第一次给号
Begin
Set @DocID = @BEGINCOUNT + @COUNT - 1;
UPDATE BSNRG SET CURRENTCOUNT = @DocID WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT;
Set @DocID = @DocID - @COUNT + 1; -- 返回产生的第一个号码
EndElse -- 在已产生号码的基础上自动累加号码
Begin
Set @DocID = CAST(@CURRENTCOUNT AS decimal(18,0)) + @COUNT;
If (@DocID > @ENDCOUNT) -- 判断产生的号码是否已超出给号范围
Begin
Set @DocID = -1;
End
Else
Begin
UPDATE BSNRG Set CURRENTCOUNT = @DocID WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT;
Set @DocID = @DocID - @COUNT + 1; -- 返回产生的第一个号码
End
Endreal_end:If (@DocID = -1)
Begin
Select 'ERROR'
End
Else
Begin
Select @DocID
EndGO
-- 设置存储过程执行权限
GRANT EXEC ON SD_GetAutoDocNum TO PUBLICGO
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
一方面,他们会为您的问题提供满意的答案,
另一方面,也邀请您为他们投上宝贵的选票。2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
中抽取3名幸运者,赠送由IBM提供的精美礼品一份!此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=146&pointid2=1&agains=1&pointid3=5非常感谢您对本次活动的支持!
--------------------------------------------------------------