Я пытался перевести ваш курсор в код, основанный на множестве, но у меня нет возможности проверить правильность моего решения, и я не выспался прошлой ночью, так что я мог пропустить некоторые вещи здесь и там - и это, вероятно, может быть более короткий и более эффективный код, чем то, что я написал, но он должен дать вам хорошее место для начала:
CREATE TRIGGER [dbo].[trAfterUpdateInfoDoc]
ON [dbo].[InfoDocs]
AFTER UPDATE
AS
BEGIN
WITH CTE1 AS
(
SELECT ifd.Id,
SUM(CASE WHEN IsRequired = 1 THEN 1 ELSE 0 END) As RequiredCount,
(
select count(*)
from InfoDocFields
where InfoDocFields.InfoDocId = ifd.Id,
and InfoDocTemplateFieldId in (
select id
from InfoDocTemplateFields
where InfoDocTemplateId = idtf.InfoDocTemplateId
and IsRequired = 1
)
and
InfoDocFields.BooleanValue is not null
or (InfoDocFields.StringValue is not null and InfoDocFields.StringValue <> '')
or InfoDocFields.IntValue is not null
or InfoDocFields.DateValue is not null
) As Filledcount
FROM InfoDocs ifd
JOIN InfoDocTemplateFields idtf
ON ifd.InfoDocTemplateId = idtf.InfoDocTemplateId
WHERE exists (SELECT 1 FROM Inserted AS i WHERE i.id = ifd.id)
GROUP BY ifd.Id, idtf.InfoDocTemplateId
), CTE2 AS
(
SELECT ifd.Id,
CASE WHEN RequiredCount = 0 THEN
100
ELSE
Filledcount / RequiredCount * 100.0
END As Completed
FROM CTE1
)
UPDATE docs
SET PercentageCompleted = Completed
FROM InfoDocs docs
JOIN cte2
ON docs.id = cte2.Id
END