2016-06-20 3 views
3

Ich möchte eine automatische Inkrement-ID mit Präfix erreichen, aber die Nummer zurücksetzen, wenn sie ein anderes Präfix hat.MSSQL Auto-Inkrement-ID mit Präfix

Der Ausgang I sieht wie folgt aus wollen:

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

Aber das Ergebnis, das ich mit meinem Skript bekam, ist dies:

ID PREFIX PROJECTID 
1 PID_ PID_1 
2 PID_ PID_2 
3 RID_ RID_3 
4 RID_ RID_4 

Hier mein Skript ist die Tabelle

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_') 
zu erstellen

Ich benutze MS SQL 2012

+0

Benutzerdefinierte Funktionen helfen werden Sie tun dies – MusicLovingIndianGirl

+1

Welche Version von SQL Server Sie verwenden ?? –

+0

In Ihrem Fall hängt die beste Lösung von der Version von SQL Server ab. – Alex

Antwort

0

wollen Sie so

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_') 

nehme an, Sie über Daten in der Tabelle jetzt

haben, wenn Sie ausführen möchten Einsatz mit 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 

siehe oben Abfrage kann Ihnen helfen.

+0

Ich habe das nicht versucht, aber indem ich mir das Skript ansehe, denke ich, dass ich jedes Mal, wenn ich einen neuen Datensatz hinzufüge, eine Aktualisierungsabfrage ausführen soll? – Aldrin

0

verwenden Hey diese Abfrage ..

   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 

Dank