Sql 导致重复键的字母数字序列的存储过程

Sql 导致重复键的字母数字序列的存储过程,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我在MSSQLServer2008上使用了一个存储过程,它生成一个渐进的字母数字序列,用于在另一个表中存储不同数据的加载 但现在,当多个进程几乎同时访问此存储过程时,经常会出现问题 有人对如何解决这些问题有什么建议、如何构建它或其他想法吗 以下是SP的实际代码: CREATE PROCEDURE [dbo].[GetNextAlpha] @s varchar(8) OUTPUT AS BEGIN TRANSACTION DECLARE @res INT; EXEC @res = sp_getap

我在MSSQLServer2008上使用了一个存储过程,它生成一个渐进的字母数字序列,用于在另一个表中存储不同数据的加载

但现在,当多个进程几乎同时访问此存储过程时,经常会出现问题

有人对如何解决这些问题有什么建议、如何构建它或其他想法吗

以下是SP的实际代码:

CREATE PROCEDURE [dbo].[GetNextAlpha] @s varchar(8) OUTPUT
AS
BEGIN TRANSACTION
DECLARE @res INT;
EXEC @res = sp_getapplock
            @Resource = 'Upsert_app_lock',
            @LockMode = 'Exclusive',
            @LockOwner = 'Transaction',
            @LockTimeout = 2000,
            @DbPrincipal = 'public';

IF @res NOT IN (0, 1)
BEGIN
    RAISERROR ( 'Unable to acquire Lock', 16, 1 )
END
ELSE
BEGIN

    DECLARE @n CHAR(36) = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    DECLARE @pos TINYINT;

    SET @s = (SELECT TOP 1 [CurHighKey] FROM [dbo].[HighKey]);
    SET @pos = LEN(@s);

    WHILE @pos > 0
    BEGIN
        IF SUBSTRING(@s, @pos, 1) = 'Z'
        BEGIN
            SET @s = STUFF(@s, @pos, 1, '0');
            SET @pos = @pos - 1;
        END
        ELSE
        BEGIN
            SET @s = STUFF(@s, @pos, 1, SUBSTRING(@n, CHARINDEX(SUBSTRING(@s, @pos, 1), @n) + 1, 1))
            SET @pos = 0
        END
    END

    UPDATE [dbo].[HighKey] set [CurHighKey] = @s;

    EXEC @res = sp_releaseapplock
                @Resource = 'Upsert_app_lock',
                @DbPrincipal = 'public',
                @LockOwner = 'Transaction';

END

COMMIT

这个问题与Java或C无关。。。所以我删除了这些标签。为什么不能使用内置的
IDENTITY
列为您生成唯一的ID?这正是他们的目的;在保证唯一性的序列中生成唯一ID。试图创建自己独特的字符串几乎总是会导致问题。。。或者,如果您想要一些字母数字,请使用UniqueIdentifier/Guid:
创建表MyTable(UniqueColumn UniqueIdentifier DEFAULT NEWID())
我会明确建议将
NEWSEQUENTIALID()
作为
NEWID()
的默认值,除非高度关注安全性(我猜不是,因为当前的要求是顺序值。Kimberly Tripp讨论了在
NEWSEQUENTIALID()上使用
NEWID()
对性能的影响。我对NEWSEQUENTIALID()的问题是,我不能将其限制为8个字符,这是字母数字序列应该具有的最大值。