加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server-2008 – 通过存储过程模拟TSQL序列

发布时间:2021-05-24 02:58:03 所属栏目:编程 来源:网络整理
导读:我必要建设一个模仿TSQL序列的存储进程.也就是说,它老是在每次挪用时给出一个增进的差异整数值.另外,假如传入一个整数,则应该返回该值,假如从未有过更大的功效或下一个可用的最高整数.不消说,可以有多个客户端同时挪用此SP. 给定一个包括MetaKey varchar(max)

我必要建设一个模仿TSQL序列的存储进程.也就是说,它老是在每次挪用时给出一个增进的差异整数值.另外,假如传入一个整数,则应该返回该值,假如从未有过更大的功效或下一个可用的最高整数.不消说,可以有多个客户端同时挪用此SP.

给定一个包括MetaKey varchar(max)和MeatValueLong bigInt列的MetaInfo表.祈望MetaKey为’Internal-ID-Last’的行将包括分派的最后一个最高值.我建设了以下存储进程:

CREATE PROCEDURE [dbo].[uspGetNextID]
(
  @inID bigInt 
)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION

    UPDATE MetaInfo WITH (ROWLOCK) 
      SET MetaValueLong = CASE 
                            WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1 
                            ELSE @inID+1
                          END 
    WHERE MetaKey = 'Internal-ID-Last'

    SELECT MetaValueLong 
    FROM MetaInfo
    WHERE MetaKey = 'Internal-ID-Last'

    COMMIT TRANSACTION 

END

我的题目很简朴,这个存储进程是否按预期事变(全部呼唤者将被分派一个独一的功效)?

办理要领

我看过了,MS本身提供了一个没有锁的办理方案

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

这是一个没有锁定提醒的简朴更新,可是他们说它锁定/死锁.

关于这一点也没什么出格的.

我倾向于将UPDLOCK添加到您的ROWLOCK(按照“table as a queue” (SO)但没有READPAST).假如第二个进程开始读取,这将增进断绝.

可是,全部你的历程想要读/写统一行的究竟让我本身揣摩. READPAST应承安详并发,但在这种环境下它是无用的.

留意:您可以行使OUTPUT子句而不是第二次选择,然后您不必要事宜.

HTH …

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读