Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103763234
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-23 08:36:44

    来源:赛迪网    作者:Alvin

在对数据库编程的过程中,许多人经常会用一个ID列标记该记录的信息。但获得一个可用的编号后经常需要频繁的查找以使编号不被打断,本文将主要介绍一个解决此问题的示例,具体内容请参考下文:

/*
过程名 getNum
功能:  取得指定表的下一个可用的编号
输入参数:   @tablName 表名
@FileldName 即要查询的字段名.在不同的表编号所写的列名不是一样的.如有ID Num等
@Num 返回下一个可用的编号  
*/
CREATE PROCEDURE dbo.getNum  
@tablName VARCHAR(8),
@FileldName VARCHAR(8),
@Num  VARCHAR(6) OUTPUT
AS
DECLARE @Sql  VARCHAR(200)
DECLARE @oldNum INT,@newNum VARCHAR(6)
SET @Sql=''  
SET @Sql='DECLARE Mycursor CURSOR FOR   SELECT '+ RTRIM(@FileldName) + 
' FROM ' + RTRIM(@tablName) 
EXEC(@Sql)
IF @@ERROR=0
BEGIN
SET  @oldNum=1
OPEN Mycursor
FETCH NEXT FROM Mycursor INTO @newNum
WHILE @@FETCH_STATUS=0
BEGIN
IF REPLICATE(0,3-LEN(@oldNum))+CAST(@oldNum AS VARCHAR) = @newNum 
SET @oldNum=@oldNum+1
ELSE
BEGIN 
SET @Num=REPLICATE(0,3-LEN(@oldNum))+CAST(@oldNum AS VARCHAR) 
RETURN  
END
FETCH NEXT FROM Mycursor INTO @newNum 
END
CLOSE Mycursor
DEALLOCATE Mycursor
SET @Num=REPLICATE(0,3-LEN(@oldNum))+CAST(@oldNum AS VARCHAR) 
--如果顺序没有被打断
RETURN
END   
ELSE
RAISERROR
('该表或列名不存在.请检查输入的表名和列名是否正确?',7,1)
GO
阅读(210) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~