Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “插入触发器”-插入后更新列_Sql_Sql Server 2008_Sql Server 2005_Sql Server 2008 R2_Sql Server 2012 - Fatal编程技术网

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)