16,554
社区成员
发帖
与我相关
我的任务
分享
BEGIN TRANSACTION
BEGIN TRY
-- 直接旧值+1
UPDate SYS_TableAUTOID SET BigEndVAL=BigEndVAL+1 WHERE VarTableName=@NVrTableName AND VarFldName=@NVrFldName
IF @@ROWCOUNT <> 0
BEGIN
-- 如果更新成功,该记录已经被锁住,不会被其它会话更新,获取的新值就是旧值+1
SELECT @BigNextVal=BigEndVAL FROM SYS_TableAUTOID WHERE VarTableName=@NVrTableName AND VarFldName=@NVrFldName
END
ELSE
BEGIN
-- 如果更新不成功,说明主键不存在,则插入值1
INSERT IntO SYS_TableAUTOID (VarTableName,VarFldName,BigEndVAL) VALUES(@NVrTableName,@NVrFldName,1)
-- 如果其它会话先插入,就会有主键重复错误。
-- 本会话插入成功记录也被加锁,新值必定是1
SET @BigNextVal=1
END
COMMIT TRANSACTION
END TRY
--流水号表。
CREATE TABLE [dbo].[SYS_TableAUTOID](
[VarTableName] [nvarchar](128) NOT NULL,
[VarFldName] [nvarchar](64) NOT NULL,
[BigEndVAL] [bigint] NULL,
CONSTRAINT [PK_SYS_TableAUTOID] PRIMARY KEY CLUSTERED
(
[VarTableName] ASC,
[VarFldName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--输出指定表指定字段流水号。
CREATE PROC [dbo].[prc_GetNextAUID] (
@NVrTableName NVarChar(128), --表名
@NVrFldName NVarChar(64), --字段名
@BigNextVal BigInt OUTPUT) --输出流水的下一个值.
AS BEGIN
BEGIN TRANSACTION
BEGIN TRY
SELECT @BigNextVal=BigEndVAL FROM SYS_TableAUTOID WHERE VarTableName=@NVrTableName AND VarFldName=@NVrFldName
IF ISNULL(@BigNextVal,0)=0 BEGIN --将新的标识插入到 SYS_TableAUTOID
SET @BigNextVal=(ISNULL(@BigNextVal,0) + 1)
INSERT IntO SYS_TableAUTOID (VarTableName,VarFldName,BigEndVAL) VALUES(@NVrTableName,@NVrFldName,@BigNextVal)
End ELSE BEGIN --更新下一个值.
SET @BigNextVal=(ISNULL(@BigNextVal,0) + 1)
UPDate SYS_TableAUTOID SET BigEndVAL=@BigNextVal WHERE VarTableName=@NVrTableName AND VarFldName=@NVrFldName
End
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
RETURN @BigNextVal
End
GO