MS SQL中自定义唯一ID生成

时间:2016-05-18 05:49:33

标签: sql-server

我想在sql表中创建包含以下信息的自定义ID

ID ='SRIG'+'DDMMYY'+ 5位数字。

表格详情

CREATE TABLE SR
(
    SRREQID NVARCHAR(100) PRIMARY KEY, 
    -- Your @Entity ID might be another candidate here
    SRID INT
);

SQL查询

DECLARE @EntityId INT;
DECLARE @SRREQID NVARCHAR(100);

-- BEGIN TRAN
 SELECT @EntityId = ISNULL(MAX(SRID),0) FROM SR;

 Select @SRREQID = 'SRIC'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)+
              RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+
              RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)+                 
              RIGHT('000000'+ CONVERT(NVARCHAR(10), @EntityId+1),6);

 INSERT INTO SR(SRREQID,SRID) VALUES(@SRREQID,@EntityId+1);

 SELECT * FROM SR;


-- COMMIT TRAN;

查询输出

SRREQID             SRID
SRIC160518000100    100

2 个答案:

答案 0 :(得分:2)

您也可以使用计算列,如下所示:

create table SR
    (SRREQID AS -- Your computed column
        'SRIC'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)+
              RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+
              RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)+                 
              RIGHT('00000'+ CONVERT(NVARCHAR(10), SRREQID_SEQ),5)
    , SRREQID_SEQ INT IDENTITY(1,1) -- ID used by your computed column
    , MyRandomVal varchar(25)) -- Random actual data for the table

然后,创建一个作业,在每天开始时,在00.00执行以下命令,以便在第二天将SRREQID_SEQ的身份重新设置为1。

DBCC CHECKIDENT ('dbo.SR', RESEED, 0);

可能有一种更聪明的方法可以解决这个问题,但实际上我还没有遇到过类似这样的事情会有用的情况。

所有这一切的好处是您不需要复杂的脚本来插入新数据。

您只需正常插入数据,数据库就会自动为您处理SRREQID。像这样:

INSERT SR (MyRandomVal) VALUES ('My data')

编辑:另外,我建议您查看下面的Zohar Peled评论,他建议可以进一步简化此解决方案,并根据您的情况和数据库负载和使用情况,可能比我上面的建议更适合你的情景。

答案 1 :(得分:1)

适用于SQL Server 2012及更高版本。

首先创建一个SEQUENSE

CREATE SEQUENCE dbo.testing
    START WITH 1
    INCREMENT BY 1 ;
GO

然后你可以运行它来获得新的id:

SELECT  'SRIG' + REPLACE(CONVERT(nvarchar(10),GETDATE(),4),'.','') + 
        RIGHT('0000'+CAST(NEXT VALUE FOR dbo.testing as nvarchar(5)),5)

输出:

SRIG18051600001

修改

如果您需要每天重新启动序列,请使用此查询:

ALTER SEQUENCE dbo.testing RESTART WITH 1;