2016-12-26 6 views
0

Ich verwende SQL Server und muss eine Buchungsnummer mit Bezug auf die Mandanten-ID führen.Automatisches Inkrement unter Berücksichtigung der Mandanten-ID

Ich kann die Autoinkrement-ID nicht verwenden, da sie sequenziell inkrementell ist und Lücken in den Client-Anwendungen aufweist.

konnte ich nicht berechnete Spalten verwenden als Aggregatfunktionen wie Max

nicht erlaubt ist

enter image description here

Was ist der beste Ansatz für diese wäre?

+1

Verwenden 'ROW_NUMBER() OVER (PARTITION BY TenantID ORDER BY ID ASC)' –

+0

@ M.Ali ist dies für SELECT-Abfragen oder Ansichten neu zu berechnen oder? Ich möchte die Spalte zur Tabelle hinzufügen. – PAVITRA

+1

Neugierig, warum Sie Max nicht benutzen können? Wenn Sie Ihren Datensatz einfügen, wird PaymentId = (SELECT Max (PaymentId) + 1 FROM-Tabelle WHERE TenantId = @tenantId). Auch, als eine kleine Empfehlung, wenn PaymentId nicht zu einer anderen Tabelle beitreten würde ich es einfach PaymentNumber nennen (ID impliziert einen Primärschlüssel zu einer anderen Tabelle). – BlackjacketMack

Antwort

3

Sie können auch verarbeiten, wenn Daten einfügen, zum Beispiel:

insert into table1(ID,TenantId,PaymentId) 
select 6,2,isnull(max(PaymentId)+1,1) 
from table1 where TenantId=2 
group by TenantId 

Wenn Sie Trigger verwenden möchten, Dies ist ein Beispiel, an der THS Probe, Sie sogar eine PaymentId angeben, wenn auch Daten, diesen Trigger Einfügen die PaymentId

DROP TABLE table1 
    CREATE TABLE Table1(ID INT IDENTITY(1,1),TenantId INT ,PaymentId INT) 

    CREATE TRIGGER trg_UpdatePaymentId 
     ON dbo.TABLE1 
     AFTER INSERT 
    AS 
    BEGIN 

     SET NOCOUNT ON; 

     UPDATE t SET t.PaymentId=a.rn 
     FROM dbo.TABLE1 AS t INNER JOIN (
      SELECT i.ID,(ISNULL(c.MaxPaymentId,0)+ ROW_NUMBER()OVER(PARTITION BY TenantId ORDER BY ID)) AS rn FROM Inserted AS i 
      OUTER APPLY(
       SELECT MAX(tt.PaymentId) AS MaxPaymentId FROM Table1 AS tt WHERE tt.TenantId=i.TenantId AND NOT EXISTS(SELECT 0 FROM Inserted AS ii WHERE ii.ID=tt.ID) 
      ) AS c 
     ) AS a ON a.ID=t.ID 


    END 
    GO 


    INSERT INTO table1(TenantId)VALUES(1),(2),(1),(1) 
    SELECT * FROM dbo.TABLE1 
 
ID   TenantId PaymentId 
----------- ----------- ----------- 
1   1   1 
2   2   1 
3   1   2 
4   1   3 
+0

Benötigen Sie die Korrektur in der Tabellenebene, wie ich. Net Entity Framework zum Hinzufügen von Daten verwenden. – PAVITRA

+0

@PAVITRA Ich gebe Ihnen ein Trigger-Beispiel. –

Verwandte Themen