I have created the 2 After Insert Trigger on same Table. 1st Trigger executed successfully. But 2nd Trigger is not executing and giving the exception from c# code 'Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.'
Earlier I used the CTE in my trigger but I read that CTE is not supported in Triggers. Then I used Temp Tables.
ALTER TRIGGER [dbo].[CodedDatas_INS_ProjectOperationalDataUserWise]
ON [LIO00110].[dbo].[CodedDatas]
AFTER INSERT
AS
BEGIN
--UPDATE [SydCoding].[DBO].[ProjectReportOperationDataUserWise]
-- SET DocCorrected = 0
SET NOCOUNT ON;
CREATE TABLE #CTE1 (EnteredBy varchar(50), ReviewedTimeInMin Decimal(30,4),CodingTimeInMin Decimal(30,4));
CREATE TABLE #CTE2 (EnteredBy varchar(50), CodingTimeInHR Decimal(30,4),ReviewedTimeInHR Decimal(30,4));
CREATE TABLE #CTE3 (EnteredBy varchar(50), DocCoded int);
CREATE TABLE #CTE4 (EnteredBy varchar(50), DocReviewed int);
CREATE TABLE #CTE5 (EnteredBy varchar(50), DocCorrected int);
CREATE TABLE #CTE6 (EnteredBy varchar(50), LastModified varchar(50));
CREATE TABLE #CTE7 (ProjectId varchar(50),EnteredBy varchar(50), CODINGRATE Decimal(30,4), REVIEWRATE Decimal(30,4), DocCoded int, DocReviewed int,
CodingTimeInMin Decimal(30,4),ReviewedTimeInMin Decimal(30,4),DocCorrected int,LastModified varchar(50),PerDocCorrected Decimal(30,4));
INSERT INTO #CTE1 (EnteredBy,ReviewedTimeInMin,CodingTimeInMin)
Select C1.EnteredBy,ReviewedTimeInMin=Sum(ROUND(CAST(C1.QATime AS FLOAT)/(CAST(60 AS FLOAT)),4)),
CodingTimeInMin=Sum(ROUND(CAST(C1.CODINGTIME AS FLOAT)/(CAST(60 AS FLOAT)),4))
from Inserted C1
INNER JOIN
(Select Document_Id,Max(LastModified) As LastModified from Inserted Group By Document_Id) C2
on C1.Document_ID=C2.Document_ID And C1.LastModified=C2.LastModified
group by C1.EnteredBy;
INSERT INTO #CTE2 (EnteredBy,CodingTimeInHR,ReviewedTimeInHR)
Select CodingTimeInHR=ROUND(CodingTimeInMin/CAST(60 AS FLOAT), 4) ,
ReviewedTimeInHR=ROUND(ReviewedTimeInMin/CAST(60 AS FLOAT), 4), EnteredBy
from #CTE1;
INSERT INTO #CTE3 (EnteredBy,DocCoded)
Select C1.EnteredBy,DocCoded=Count(C1.Document_Id)
from Inserted C1
INNER JOIN
(Select Document_Id,Max(LastModified) As LastModified from Inserted Group By Document_Id) C2
on C1.Document_ID=C2.Document_ID And C1.LastModified=C2.LastModified And C1.Coded=1
group by C1.EnteredBy;
INSERT INTO #CTE4 (EnteredBy,DocReviewed)
Select C1.EnteredBy,DocReviewed=Count(C1.Document_Id)
from Inserted C1
INNER JOIN
(Select Document_Id,Max(LastModified) As LastModified from Inserted Group By Document_Id) C2
on C1.Document_ID=C2.Document_ID And C1.LastModified=C2.LastModified And C1.Coded=1 AND C1.Revision=1
group by C1.EnteredBy;
INSERT INTO #CTE5 (EnteredBy,DocCorrected)
Select C1.EnteredBy,DocCorrected=Count(C1.Document_Id)
from Inserted C1
INNER JOIN
(Select Document_Id,Max(LastModified) As LastModified from Inserted Group By Document_Id) C2
on C1.Document_ID=C2.Document_ID And C1.LastModified=C2.LastModified And C1.IsCorrected=1
group by C1.EnteredBy;
INSERT INTO #CTE6 (EnteredBy,LastModified)
Select C1.EnteredBy,LastModified=Max(C2.LastModified)
from Inserted C1
INNER JOIN
(Select Document_Id,Max(LastModified) As LastModified from Inserted Group By Document_Id) C2
on C1.Document_ID=C2.Document_ID And C1.LastModified=C2.LastModified And C1.Coded=1 AND C1.Revision=1
group by C1.EnteredBy;
INSERT INTO #CTE7 (ProjectId,EnteredBy,CODINGRATE,REVIEWRATE,DocCoded,DocReviewed,CodingTimeInMin,ReviewedTimeInMin,DocCorrected,LastModified,PerDocCorrected)
Select ProjectId='LIO00110', CT3.EnteredBy, CODINGRATE=(CT3.DocCoded/NULLIF(CT2.CODINGTIMEINHR,0)),
REVIEWRATE=(CT4.DocReviewed/NULLIF(CT2.ReviewedTimeInHR,0)),CT3.DocCoded,CT4.DocReviewed,
CT1.CodingTimeInMin,CT1.ReviewedTimeInMin,CT5.DocCorrected,CT6.LastModified,
PerDocCorrected=(Case When CT3.DocCoded>0 Then (Cast( (ROUND(cast(CT5.DocCorrected AS float)/cast(CT3.DocCoded AS float), 4))*100 As int ))
Else 0.0000 END
)
From #CTE3 CT3
Inner Join #CTE2 CT2 on CT3.EnteredBy=CT2.EnteredBy
Inner Join #CTE4 CT4 on CT3.EnteredBy=CT4.EnteredBy
Inner Join #CTE1 CT1 on CT3.EnteredBy=CT1.EnteredBy
Inner Join #CTE6 CT6 on CT3.EnteredBy=CT6.EnteredBy
Full Join #CTE5 CT5 on CT3.EnteredBy=CT5.EnteredBy;
Select ProjectId,EnteredBy,CODINGRATE,REVIEWRATE,CodingTimeInMin,ReviewedTimeInMin,DocCoded,DocReviewed ,DocCorrected,
PerDocCorrected,LastModified
From #CTE7;
MERGE INTO [SydCoding].[DBO].[ProjectReportOperationDataUserWise] AS target
USING #CTE7 AS source ON target.ProjectId = source.ProjectId AND target.UserId = source.EnteredBy
WHEN MATCHED THEN
-- Update existing clients
UPDATE
SET target.[TotalCoded] = source.DocCoded,
target.[TotalReviewed] = source.DocReviewed,
target.[CodedTime] = source.CodingTimeInMin,
target.[ReviewedTime] = source.ReviewedTimeInMin,
target.[CodedRate] = source.CODINGRATE,
target.[ReviewedRate] = source.REVIEWRATE,
target.[DocCorrected] = source.DocCorrected,
target.[PercentDocCorrected] = source.PerDocCorrected,
target.[LastModifiedOn] = source.LastModified
WHEN NOT MATCHED BY target THEN
-- Insert new data
INSERT ([ProjectId],[TotalCoded], [TotalReviewed], [CodedTime], [ReviewedTime], [CodedRate], [ReviewedRate], [DocCorrected],
[PercentDocCorrected], [UserId], [CreatedOn],[LastModifiedOn])
VALUES (source.ProjectId, source.DocCoded, source.DocReviewed, source.CodingTimeInMin,source.ReviewedTimeInMin, source.CODINGRATE, source.REVIEWRATE,
source.DocCorrected, source.PerDocCorrected, source.EnteredBy, GetDate(), source.LastModified)
;
DROP TABLE #CTE1;
DROP TABLE #CTE2;
DROP TABLE #CTE3;
DROP TABLE #CTE4;
DROP TABLE #CTE5;
DROP TABLE #CTE6;
DROP TABLE #CTE7;
End
What is wrong in my trigger or I am doing something wrong. Please suggest.
SELECTstatement that returns rows to the client, which might be confusing the API and cause the error. Try removing the query and be aware that returning results in trigger code is deprecated functionality that will be removed from a future release.