0

新しいレコードが入ったときに、その特定の列に前のレコードと同じ内容が含まれている場合、既存のすべてのエントリの特定の ID 列が 1 増加し、新しいエントリが 0 になるようにトリガーを書きたいと思います。既存のレコードがない場合は、新しいレコードが自動的に割り当てられ、その列に ID 0 が割り当てられます。

たとえば、既存のデータが次のようになっているとします。

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

John Doe に 3.5 ドルの請求書を挿入すると、レコードは自動的に次のようになります。

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 でこのようなトリガーを記述する方法を教えてください。

ありがとう!

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 に答える