我有一个表,其中包含一个触发器,如果在该表上执行任何插入或更新操作,将会调用该触发器。
此触发器将在其他物理表中插入新行。
首先,我将整个数据插入临时表,然后将数据插入物理表(具有触发器)。
执行插入操作后,临时表中的所有记录都将插入到物理表中,但触发器仅针对第一条记录执行,而其余的记录则不执行。
任何人都可以帮我解决这个问题。
注意:使用光标它工作正常但是出于性能问题我不想使用光标。
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
答案 0 :(得分:0)
这是Bulk如此之快的原因之一:)。阅读Bulk Insert语法,您将看到FIRE_TRIGGERS
参数。用它。
答案 1 :(得分:0)
正如我在评论中写的那样 - 你以不正当的方式使用inserted
。现在写的它只能用于1行。
第二个是WEIRD数量的变量,只使用了少数变量,为什么?
第三 - 你在批处理结束时使用SP,你需要发布它的代码,我打赌它有一些插入,也许你可以避免使用这个SP并直接插入一些表中插入