触发器不要求插入大行

时间:2016-09-27 12:40:46

标签: sql sql-server sql-server-2008

我有一个表,其中包含一个触发器,如果​​在该表上执行任何插入或更新操作,将会调用该触发器。

此触发器将在其他物理表中插入新行。

首先,我将整个数据插入临时表,然后将数据插入物理表(具有触发器)。

执行插入操作后,临时表中的所有记录都将插入到物理表中,但触发器仅针对第一条记录执行,而其余的记录则不执行。

任何人都可以帮我解决这个问题。

注意:使用光标它工作正常但是出于性能问题我不想使用光标。

ALTER TRIGGER [dbo].[MY_TRG]  
ON [dbo].[T_EMP_DETAILS]  
FOR INSERT , UPDATE  
AS  
BEGIN   
IF UPDATE(S_EMPLOYEE_ID)OR UPDATE(S_GRADE_ID)OR UPDATE(D_EFFECTIVE_DATE)  OR UPDATE(S_EMPLOYEE_STATUS)  
BEGIN  

DECLARE @EmpId varchar(6)  
DECLARE @HeaderId Int  
DECLARE @FYStartYear varchar(4)  
DECLARE @EffDate Smalldatetime  
DECLARE @UpdatedBy varchar(10)  
DECLARE @ActionType varchar(1)  
DECLARE @RowCount Int  
DECLARE @EmpRowCount Int  
DECLARE @AuditRowsCount Int   
DECLARE @EMP_STATUS VARCHAR(1)
DECLARE @D_FIN_START_YEAR DATETIME
DECLARE @Food_Count int

SELECT @FYStartYear =  CAST(YEAR(D_CURRENT_FY_ST_DATE)AS VARCHAR) FROM dbo.APPLICATION  WHERE B_IS_CURRENT_FY = 1  

SELECT @UpdatedBy = 'SHARDUL'  

select  @EmpId =  S_EMPLOYEE_ID from inserted  
select  @HeaderId =  N_HEADER_TXN_ID from inserted  
select @EffDate = D_EFFECTIVE_DATE from inserted 
select @FLEXI_AMT = N_FLEX_BASKET_AMT  from inserted  
select @EMP_STATUS = S_EMPLOYEE_STATUS from inserted   
select @D_FIN_START_YEAR=D_FIN_START_DATE  from inserted

SELECT @RowCount =  count(*) from T_EMP_DETAILS  
WHERE S_EMPLOYEE_ID = @EmpId and   
SUBSTRING(CAST(D_EFFECTIVE_DATE AS VARCHAR),1,11) =       SUBSTRING(CAST(@EffDate AS VARCHAR),1,11)  

BEGIN  
exec  INSERT_DEFAULT_VALUES @EmpId,@HeaderId,@UpdatedBy 
END

2 个答案:

答案 0 :(得分:0)

这是Bulk如此之快的原因之一:)。阅读Bulk Insert语法,您将看到FIRE_TRIGGERS参数。用它。

答案 1 :(得分:0)

正如我在评论中写的那样 - 你以不正当的方式使用inserted。现在写的它只能用于1行。

第二个是WEIRD数量的变量,只使用了少数变量,为什么?

第三 - 你在批处理结束时使用SP,你需要发布它的代码,我打赌它有一些插入,也许你可以避免使用这个SP并直接插入一些表中插入