在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个回答:
关注!!
|