Sql “插入触发器”-插入后更新列
是否有可能为给定的分支机构和公司复制贷款编号?我的评论-如果我们可以安全地假设从未删除任何行,我将创建以下结构:Sql “插入触发器”-插入后更新列,sql,sql-server-2008,sql-server-2005,sql-server-2008-r2,sql-server-2012,Sql,Sql Server 2008,Sql Server 2005,Sql Server 2008 R2,Sql Server 2012,是否有可能为给定的分支机构和公司复制贷款编号?我的评论-如果我们可以安全地假设从未删除任何行,我将创建以下结构: CREATE TRIGGER [dbo].[TR_dbo_GlLoan_LoanNumber] ON [dbo].[GlLoan] AFTER INSERT AS BEGIN if @@ROWCOUNT = 0 return SET NOCOUNT ON; declare @count int; set @count= (select max(loa
CREATE TRIGGER [dbo].[TR_dbo_GlLoan_LoanNumber] ON [dbo].[GlLoan] AFTER INSERT
AS
BEGIN
if @@ROWCOUNT = 0
return
SET NOCOUNT ON;
declare @count int;
set @count= (select max(loannumber) from glloan where branchid=(select branchid from inserted) and CompanyId=(select CompanyId from inserted))
update glloan set loannumber=@count+1 where id=(select id from inserted)
END
GO
然后,使用该视图的方式与使用表的方式相同。LoanNumber是自动计算的,正如我所说的,只要不删除任何行,分配的编号就不会更改。我们可以添加具有多个列的唯一约束
CREATE TABLE _GILoan (
/* Columns as currently, except no loannumber column */
_Id int IDENTITY(1,1) not null /* or is Id already defined so? */
)
GO
CREATE VIEW GILoan
AS
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY branchid,companyid
ORDER BY _Id) /* Or Id */
as LoanNumber
FROM _GILoan
GO
并使用插入前触发器计算贷款编号。因此,不会插入任何重复项。这不完全是对您的问题的回答,但是:使用标识作为贷款编号不是更简单吗?您的触发器坏了。inserted可以包含多行,此时您将得到一个错误,例如branchid=select branchid from inserted表示子查询返回了多行value@Marko由于多个分支机构或公司都有相同的贷款编号,所以不使用标识。@Damien_不信者,我如何才能做到这一点。表中的loan number对于给定的公司和分支机构来说应该是唯一的整数。如果我们假设您的代码已经删除了任何行,否则如果删除了最近的插入,下一次插入将生成相同的唯一值,然后只使用一个标识列,然后通过按branchid划分的行数计算贷款数,按Id划分的公司Id顺序。我认为您在这里提到的是正确的。但是我不想创建一个视图来使用,因为我首先使用的是实体框架代码,如果我们使用视图,那么更改集将是巨大的。感谢你所付出的努力。有没有其他方法可以通过触发器来实现?
ALTER TABLE dbo.glloan
ADD CONSTRAINT ucLoanNumber UNIQUE (BranchId, CompanyId, LoanNumber)