2016-12-26 27 views
0

我正在使用SQL Server并需要保留一个参考租户ID的记帐号码。考虑租户ID的自动增量编号

我无法使用自动递增ID,因为它是按顺序递增并且在客户端应用程序中存在间隙。

我不能使用计算列像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 WHERE TenantId = @tenantId)。 此外,作为一个轻微的建议,如果PaymentId没有加入到另一个表中,我会简单地将它称为PaymentNumber(Id表示另一个表的主键)。 – 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实体框架来添加数据。 – PAVITRA

+0

@PAVITRA我给你一个触发器样本。 –