教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · MsSql综合技巧

在SQLServer中完成一个类似Oracle地Sequence.

学院最新推荐文章
教程推荐
『在SQLServer中完成一个类似Oracle地Sequence.』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-9-26 
在SQLServer中实现一个类似Oracle的Sequence.


各位兄弟,我们都知道SQLServer有Identity可以定义序列作为主键。而Identity有个缺点就是必须绑定表。
当然这个个有个的优势,谁也不能说谁就一定好。
不过我想在SQLServer中实现一个类似的功能,使用存储过程实现。我觉得这样灵活一些。
至于说到底是Identity好还是Sequence好,我们就不再这里详细讨论了。
说说我的想法,做个这个东西的最重要的地方是保证并发不冲突,否则没有任何意义。
至于是否能够像Sequence那样能够自动提交,这个可以后面再慢慢考虑。
而且要支持多个Table.
下面是我的代码,作了简单的测试,没有系统测试,请各位高手在理论上给我评审一下,是否有什么漏洞和问题。

IF OBJECT_ID('SYSTEM_KEY')>0
    DROP TABLE SYSTEM_KEY
GO

CREATE TABLE SYSTEM_KEY(KEY_NAME VARCHAR(30) NOT NULL, CURRENT_VALUE BIGINT, VALUE_STEP INT DEFAULT 1 NOT NULL, CONSTRAINT SYSTEM_KEY_PK PRIMARY KEY(KEY_NAME));

INSERT INTO SYSTEM_KEY VALUES('KEY_SCORE_ID',1,1);
INSERT INTO SYSTEM_KEY VALUES('KEY_TEST_ID',1,10);
IF OBJECT_ID('SP_NEXT_KEY')>0
    DROP PROCEDURE SP_NEXT_KEY
GO
CREATE PROCEDURE SP_NEXT_KEY @NEXT_VALUE BIGINT OUT , @KEY_NAME VARCHAR(30)
AS
BEGIN
    IF @KEY_NAME IS NULL
        RAISERROR ('KEY NAME IS NULL.', 16, 11);
    DECLARE @V_NEXT_VALUE BIGINT;
    DECLARE @ERROR_MESSAGE VARCHAR(1024)
    SELECT @NEXT_VALUE = CURRENT_VALUE FROM SYSTEM_KEY WITH(UPDLOCK) WHERE KEY_NAME = @KEY_NAME
    IF @@ROWCOUNT = 0
    BEGIN
        SET @ERROR_MESSAGE='INVALID KEY NAME IS PROVIDED, THE KEY NAME IS: ' + @KEY_NAME
        RAISERROR (@ERROR_MESSAGE , 16, 12);
    END;
    UPDATE SYSTEM_KEY SET CURRENT_VALUE = CURRENT_VALUE + VALUE_STEP WHERE KEY_NAME = @KEY_NAME AND CURRENT_VALUE = @NEXT_VALUE;
END
GO

使用的话,使这样
declare @nextkey INT
SP_NEXT_KEY  @nextkey, 'KEY_TEST_ID'
SELECT @nextkey

这个问题第1个回答:
如果是这样的需求,我建议你放个字段到某个表,定义为bigint,够大了吧.

每次取其后就加一.
这个问题第2个回答:
up
这个问题第3个回答:
单独建表,保存这个值,一旦使用,用代码加1,用事务保证数据处理的完整性和一致性。

这个问题第4个回答:
我只说问题:
1、没有用事务来保证锁定
2、调用方法似乎有点问题,正确是
declare  @nextkey  INT
exec SP_NEXT_KEY    @nextkey out,  'KEY_TEST_ID'
SELECT    @nextkey

这个问题第5个回答:
帮顶,关注
这个问题第6个回答:
关注!!

作者:cooldiff 来源:C.S.D.N
】【关闭窗口
·上页:
·下页:
相关文章
     数据库类教程 - MsSql综合技巧
普通教程【脑袋快想爆炸了- -!】 怎么样
普通教程关于级联删除地疑难,新手提问,
普通教程怎么样动态控制列数?
普通教程数据库恢复 MS2000
普通教程当数据库中varchar字段值为null
普通教程create function 怎么才无法要返
普通教程各位帮我看看是啥疑难啊, SQL运
普通教程SQL server 2005 安装疑难 SP2更
普通教程sql update
普通教程update触发器地疑难
普通教程字符串地查询疑难
普通教程安全性--登陆--想建一个用户tes
精彩图片汇集
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光