2016-06-20 6 views
3

Я хочу получить идентификатор автоматического инкремента с префиксом, но сбросив его, если у него есть другой префикс.Идентификатор автоинкремента MSSQL с префиксом

Выход я хочу выглядеть следующим образом:

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

+0

Пользовательские функции помогут вам сделать это – MusicLovingIndianGirl

+1

какая версия SQL Server вы используете ?? –

+0

В вашем случае лучшее решение будет зависеть от версии SQL Server. – Alex

ответ

0

вы хотите, как это

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 

см. Выше запрос может помочь вам.

+0

Я не пробовал это, но просто просмотрев сценарий, я думаю, что я должен запускать запрос на обновление каждый раз, когда добавляю новую запись? – Aldrin

0

Эй использовать этот запрос ..

   CREATE FUNCTION DBO.GET_NEX_P_ID(@PREF VARCHAR(4)) 
     RETURNS NVARCHAR(24) 
     AS 
     BEGIN 
     RETURN (SELECT @PREF+CAST(COUNT(1)+1 AS VARCHAR) FROM PROJECTS WHERE [email protected]) 
     END 
     GO 

     CREATE TABLE PROJECTS 
     (
     PREFIX VARCHAR(8), 
     PROJECTID NVARCHAR(24) 
     ) 

     GO 
     INSERT INTO PROJECTS 
     VALUES('PRJ_',DBO.GET_NEX_P_ID('PRJ_')) 
     GO 
     INSERT INTO PROJECTS 
     VALUES('PRQ_',DBO.GET_NEX_P_ID('PRQ_')) 
     GO 

Благодаря

Смежные вопросы