SQL Server:Identity by group

时间:2017-09-02 04:01:35

标签: sql sql-server sqltransaction

如何添加标识号,以便在插入行时,触发器会按如下方式分配增量编号?我正在使用SQL Server。

1    AAA  
2    AAA  
3    BBB  
4    CCC  
5    CCC  
6    CCC  
7    DDD  
8    DDD  
9    EEE  
....

我想将其转换为:

1    AAA   1
2    AAA   2
4    CCC   1
5    CCC   2
6    CCC   3
7    DDD   1
8    DDD   2

2 个答案:

答案 0 :(得分:1)

没有理由存储该值。您可以在需要时计算它:

select t.*, row_number() over (partition by name order by id) as nameId
from t;

答案 1 :(得分:0)

您可以创建一个FUNCTION来获取名称并为给定参数提供MAX标识:

CREATE FUNCTION [dbo].[GetIdentityForName] (@Name VARCHAR(MAX))
RETURNS INT
AS
  BEGIN
      RETURN
        (SELECT ISNULL(MAX(NameId),0)+1
         FROM  YourTable
         WHERE Name = @Name);
  END  

然后为DefaultValue设置NameId,以便在插入记录时调用该函数:

ALTER TABLE YourTable ADD CONSTRAINT
    DF_Identity_NameId DEFAULT ([dbo].[GetIdentityForName](Name)) FOR NameId

假设YourTable是{IdNameNameId)。

我希望对你有所帮助:)。