【SQL Server】SQL编号生成序列化

编号避免重复,且流水号自增

USE [TWEstate]
GO
/****** Object:  StoredProcedure [dbo].[PROC_Property_GetPropertyIntentionMoneyIdSYS_SEL]    Script Date: 2019/12/7 10:05:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author>
-- Create date: <2019/03/18>
-- Description:	<>
-- =============================================
ALTER PROCEDURE [dbo].[PROC_Property_GetPropertyIntentionMoneyIdSYS_SEL] 
    @cityCode	   			   VARCHAR(50)								   --房源所在市编码
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE
	@intentionMoneyIdYXJ					  VARCHAR(50) = 'Y'			   --意向(Y)  (Y+房源所在市(含直辖市)编码+年后两位+月+日+5位数编号(从00001始))
	,@MAX_SEQ int = 99999
	,@current int
	,@result varchar(30)
	,@name varchar(20)
	,@sql nvarchar(500)
	--,@code_type varchar(1)
	,@message varchar(50)
	,@modify_date date
	,@today varchar(6)
	,@curentday varchar(6)
	,@days int
	
	set @name = 'Seq_IntentionMoneyId'
	-- 判断序列是否存在
	declare @count int;
	SELECT @count=count(name) FROM sys.sequences where name = @name
    if @count = 0
	begin
		set @sql = 'CREATE SEQUENCE [dbo].' + QUOTENAME(@name) + '
					 AS [int]
					 START WITH 1
					 INCREMENT BY 1
					 MINVALUE 0
					 MAXVALUE ' + cast(@MAX_SEQ*10 as varchar) + '
					 CYCLE 
					 CACHE'
		EXEC sp_executesql @sql
	end 


	SELECT @current=CAST(current_value as int),@curentday=substring(convert(varchar(8),modify_date,112),3,6),@today=substring(convert(varchar(8),getdate(),112),3,6) FROM sys.sequences WHERE name=@name
	
	if @today > @curentday
	begin
		-- 复位(从0开始)
		set @sql = 'alter SEQUENCE [dbo].' + QUOTENAME(@name) + ' RESTART'
		EXEC sp_executesql @sql
	end
	else
	begin
		print(@current)
		
		if @current >= @MAX_SEQ
		begin
			set @days = @current / @MAX_SEQ
			-- 每超越过最大位数时,日期加1天,占用明天的流水
			if @days > 0
				set @today = substring(convert(varchar(8),dateadd(day,@days,getdate()),112),3,6)
		end
	end

	-- 获取最新值
	set @sql = 'SELECT @current = NEXT VALUE FOR [dbo].' + QUOTENAME(@name)
	EXEC sp_executesql @sql,N'@current int OUT',@current = @current OUTPUT
	if @current > @MAX_SEQ
	begin
		-- 每超越过最大位数时,日期加1天,占用明天的流水
		set @current = @current - @days * @MAX_SEQ
	end


	set @result = @IntentionMoneyIdYXJ + @cityCode + @today + RIGHT('00000'+CONVERT(VARCHAR(5),@current),5)

	select @result AS intentionMoneyId

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值