我有一个Purchaseforms
包含一些字段的表。该表有两个字段PurchaseId
,一个是身份,PurchaseNumber
一个是nvarchar
.
在 Purchaseform 表中插入一行后,它返回@@IDENTITY
. 我想在插入后立即更新 PurchaseNumber 字段。
例如
如果PurchaseId
是 1000,PurchaseNumber
则应更新为P1000
. 我该怎么做?
我有一个Purchaseforms
包含一些字段的表。该表有两个字段PurchaseId
,一个是身份,PurchaseNumber
一个是nvarchar
.
在 Purchaseform 表中插入一行后,它返回@@IDENTITY
. 我想在插入后立即更新 PurchaseNumber 字段。
例如
如果PurchaseId
是 1000,PurchaseNumber
则应更新为P1000
. 我该怎么做?
插入触发器可用于根据另一个字段更新一个字段。
请注意PurchaseNumber
,即使在插入行时提供了值,以下代码也将始终覆盖。可以将一个WHERE
子句添加到UPDATE
已经具有值的跳过行中PurchaseNumber
。
create trigger PurchaseForms_Insert on PurchaseForms after Insert as
begin
set nocount on
update PF
set PurchaseNumber = N'P' + cast( i.PurchaseId as NVarChar(10) )
from PurchaseForms as PF inner join
inserted as i on i.PurchaseId = PF.PurchaseId
end
除了触发器:inserted
和deleted
是表,因此它们可以表示集合操作的结果。假设触发器总是包含一行,而设计触发器通常是一个糟糕的计划。如果您绝对确定不会超过一行,那么请添加对行数的检查,并用于RaIsError
明确告知后来出现的人他们试图执行不可接受的语句。( if ( select Count(*) from inserted ) > 1 RaIsError( 'FooTable_Insert: No more than one row may be processed.', 25, 42 ) with log
)
可以使用更好的计算列
CREATE TABLE Purchaseforms
(
PurchaseId int IDENTITY,
PurchaseNumber AS 'P' + CAST(PurchaseId AS nvarchar(10)),
...
other columns
)