我想编写一个触发器,以便当新记录进入时,如果它的某些列包含与前一个记录相同的内容,则所有现有条目的一个特定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
现在,如果我需要插入一个新人,比如简史密斯说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中编写这样的触发器?
谢谢!
答案 0 :(得分: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