sql - 带前缀的 MSSQL 自动递增 ID

标签 sql sql-server sql-server-2012

我想实现一个带前缀的自动递增 ID,但如果它有不同的前缀,则重置该数字。

我想要的输出如下所示:

ID  PREFIX  PROJECTID
1   PID_    PID_1
2   PID_    PID_2
3   RID_    RID_1
4   RID_    RID_2

但是我用我的脚本得到的结果是这样的:
ID  PREFIX  PROJECTID
1   PID_    PID_1
2   PID_    PID_2
3   RID_    RID_3
4   RID_    RID_4

这是我创建表的脚本
CREATE TABLE PROJECTS
(ID INT IDENTITY(1,1) NOT NULL,
PREFIX NVARCHAR(10) NOT NULL,
PROJECTID AS ISNULL(PREFIX + CAST(ID AS NVARCHAR(10)), '') PERSISTED)

INSERT INTO PROJECTS(PREFIX) VALUES('PID_'),('PID_'),('RID_'),('RID_')

我正在使用 MS SQL 2012

最佳答案

你想要这样

CREATE TABLE #PROJECTS
(
  ID INT IDENTITY(1, 1)
         NOT NULL ,
  PREFIX NVARCHAR(10) NOT NULL ,
  PROJECTID NVARCHAR(11)
)


INSERT  INTO #PROJECTS
    ( PREFIX )
VALUES  ( 'PID_' ),
        ( 'PID_' ),
        ( 'RID_' ),
        ( 'RID_' )

假设您的表中有上述数据

现在,如果您想使用 DECLARE @PREFIX NVARCHAR(10) = 'RID_' 执行插入
INSERT  INTO #PROJECTS
    ( PREFIX ,
      PROJECTID
    )
    SELECT  @PREFIX  ,
            @PREFIX  + CAST(( COUNT(TT.rn) + 1 ) AS NVARCHAR(1))
    FROM    ( SELECT    ROW_NUMBER() OVER ( PARTITION BY P.PREFIX ORDER BY ( SELECT
                                                          NULL
                                                          ) ) AS rn
              FROM      #PROJECTS AS P
              WHERE     P.PREFIX = @PREFIX
            ) AS tt

请参阅上面的查询可能对您有所帮助。

关于sql - 带前缀的 MSSQL 自动递增 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37919864/

相关文章:

mysql - 在mysql中选择动态列

java - SQL按部分字母顺序排序

python - 当架构名称与表名称一起传递时,Django migrate 不起作用

mysql - 如何使用 MySql 数据库替换我的 ROW_NUMBER() 函数?

mysql - 如何避免MySQL更新中相关子查询分配中的多列

python - 使用 pyodbc 将 pandas 数据帧高效插入到 MS SQL Server

sql - 如何测试数据库的性能

sql-server - 如何查询Sql Server 2005 Express版的日志文件(.ldf)?

sql - 检查外键约束 "online"

sql - 通过 SQL PARTITION 选择最新项目