2016-12-26 7 views
0

Я использую SQL Server и должен вести учетный номер со ссылкой на идентификатор арендатора.Автоматический приращение с учетом идентификатора арендатора

Я не могу использовать идентификатор автоматического увеличения, поскольку он последовательно увеличивается и имеет пробелы в клиентских приложениях.

я не мог использовать вычисляемые столбцы как агрегатные функции, такие как Max не допускается

enter image description here

Что бы наилучший подход для этого?

+1

Используйте 'ROW_NUMBER() OVER (PARTITION BY TenantID ORDER BY ID ASC)' –

+0

@ M.Ali это для некоторых запросов и представлений в порядке? Я хочу добавить столбец в таблицу. – PAVITRA

+1

Любопытно, почему вы не можете использовать Max? Когда вы вставляете свою запись PaymentId = (SELECT Max (PaymentId) + 1 FROM Table WHERE TenantId = @tenantId). Кроме того, в качестве небольшой рекомендации, если PaymentId не присоединяется к другой таблице, я бы просто назвал ее PaymentNumber (идентификатор подразумевает первичный ключ к другой таблице). – BlackjacketMack

ответ

3

Вы также можете обрабатывать при вставке данных, например:

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

Если вы хотите использовать триггер, это образец, в тыс образце, даже указать PaymentID при вставке данных, этот триггер также перерасчета 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

Нужно исправление на уровне таблицы, поскольку я использую инфраструктуру .Net Entity для добавления данных. – PAVITRA

+0

@PAVITRA Я даю вам образец триггера. –