0

我想编写一个触发器,以便当新记录进入时,如果它的某些列包含与前一条记录相同的内容,则所有现有条目的一个特定 ID 列将增加 1,新条目将为 0,如果没有现有记录,则新记录会自动分配为该列中的 ID 0。

例如,假设我现有的数据是这样的:

FirstName  LastName  InvoiceID  Amt
-----------------------------------
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       0         $3

现在假设我要插入带有 3.5 美元发票的 John Doe,那么记录将自动变为:

FirstName  LastName  InvoiceID  Amt
-----------------------------------    
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       2         $3
John        Doe       0         $3.5

现在,如果我需要插入新的人,比如 Jane Smith 2 美元,它会变成:

FirstName  LastName  InvoiceID  Amt
--------------------------------------
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       2         $3
John        Doe       0         $3.5
Jane        Smith     0         $2

我可以知道应该如何在 T-SQL 中编写这样的触发器吗?

谢谢!

4

1 回答 1

2

这就是我要做的,而不是触发:

create table T (TID int IDENTITY(1,1) not null,FirstName varchar(10) not null,LastName varchar(10) not null,Amt decimal(18,4) not null)
go
create view V
as
    select
        FirstName,
        LastName,
        ROW_NUMBER() OVER (PARTITION BY FirstName,LastName ORDER BY TID desc) - 1 as InvoiceID,
        Amt
    from
        T
go

然后设置您的初始数据:

insert into T(FirstName,LastName,Amt) values
('John','Doe',5),
('Bill','Jane',6)
go
insert into T(FirstName,LastName,Amt) values
('John','Doe',3)

还有新的 John Doe 行:

insert into T(FirstName,LastName,Amt) values
('John','Doe',3.5)

最后是简史密斯行:

insert into T(FirstName,LastName,Amt) values
('Jane','Smith',2)

然后从视图中选择:

FirstName  LastName   InvoiceID            Amt
---------- ---------- -------------------- ---------------------------------------
Bill       Jane       0                    6.0000
Jane       Smith      0                    2.0000
John       Doe        0                    3.5000
John       Doe        1                    3.0000
John       Doe        2                    5.0000

所以我们不担心InvoiceID可能不正确,因为我们从不存储它。

select * from V
于 2013-08-08T13:08:53.547 回答