Я застрял с созданием хранимой процедуры, которая должна обновлять вычисляемый столбец ежедневно.
К сожалению, мои знания о хранимых процедурах ограничены, но, похоже, это правильное место. Я пытаюсь дать больше справочной информации:
Main-Table хранит заявки и называется tabData. Он имеет столбец IsReturn с битом типа данных (логическое значение).
1.Rule : утверждение является возвратом, когда его значение столбца fimaxActionCode является одним из этих 1, 2, 3, 4, 5, 8, 9, 12, 14, 17, 18, 20, 21, 22, 23, 24, 25, 30, 31, 32, 35.
2.Правило : заявка является не a Возврат, когда у него есть предыдущая заявка (идентифицированная с помощью значения даты и IMEI (Id-Number для мобильных телефонов) с fimaxActionCode of 8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37 в fiClaimeStatus 1, 4, 6, 254, 255.
Первое правило возврата было старым и реализовано в виде вычисляемого столбца в нашем кубе ssas. Поскольку сейчас все сложнее, я подумал, что было бы лучше поместить этот расчет в хранимую процедуру, которая выполняется каждое утро.
Это то, что я должен проверить, если утверждение кандидата (Правило 1) не выполняется с Правилом 2:
Я создал вид PrevClaim, который выбирает все предыдущие претензии:
SELECT TOP (100) PERCENT Claim.idData AS ClaimID, PrevClaim.idData AS PrevClaimID, Claim.IMEI,
Claim.Repair_Completion_Date AS ClaimRepDate, PrevClaim.Repair_Completion_Date AS PrevClaimRepDate,
PrevClaim.fimaxActionCode AS PrevFiMaxActionCode, PrevClaim.fiClaimStatus AS PrevFiClaimStatus, Claim.IsReturn AS ClaimIsReturn
FROM dbo.tabData AS Claim INNER JOIN
dbo.tabData AS PrevClaim ON Claim.IMEI = PrevClaim.IMEI AND Claim.idData <> PrevClaim.idData AND
Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date
ORDER BY PrevClaimRepDate DESC
Я могу получить последнее родительское требование для данного идентификатора с помощью этого sql-оператора (это требование должно быть проверено на соответствие правилу 2):
SELECT TOP (1) ClaimID, PrevClaimID, IMEI, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM PrevClaim
WHERE (ClaimID = 44921287)
ORDER BY PrevClaimRepDate DESC
Но теперь я не знаю, как / где проверить, было ли это утверждение родителя утверждением, которое не выполняется по правилу 2. Если я изменю этот sql и введу условие в предложение where, я получу неправильное утверждение (учитывая, что есть 4 родительских претензии, последнее по времени в порядке, но четвертое не удается, поэтому я верну четвертое, но его нужно проверить по последнему):
SELECT TOP (1) ClaimID, PrevClaimID, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM PrevClaim
WHERE (ClaimID = 44921287) AND (PrevFiMaxActionCode IN (8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37)) AND (PrevFiClaimStatus IN (1, 4, 254, 255, 6))
ORDER BY PrevClaimRepDate DESC
Я иду кругами или, может быть, слишком жарко для чего-то подобного.
Я надеюсь, что кто-то может привести меня в правильном направлении и / или показать мне, как реализовать это в хранимой процедуре (ОБНОВЛЕНИЕ ... СЛУЧАЙ , но как?).
РЕДАКТИРОВАТЬ : Я думаю, что я на правильном пути. Может быть, кто-нибудь может показать мне, как обновить всю таблицу в одном sql-утверждении. Следующая пользовательская функция дает мне правильное значение:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION dbo._isClaimReturn
(
@claimID int,
@fimaxActionCode int
)
RETURNS int
AS
BEGIN
DECLARE @isReturn int
IF(@fimaxActionCode in (1, 2, 3, 4, 5, 8, 9, 12, 14, 17, 18, 20, 21, 22, 23, 24, 25, 30, 31, 32, 35))
AND (SELECT TOP (1) PrevFiMaxActionCode
FROM PrevClaim
WHERE (ClaimID = @claimID))IN(8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37)
AND
(SELECT TOP (1)PrevFiClaimStatus
FROM PrevClaim
WHERE (ClaimID = @claimID))IN(1, 4, 254, 255, 6)
BEGIN
Set @isReturn = 0
END
ELSE
BEGIN
Set @isReturn = 1
END
RETURN @isReturn
END
GO
Еще один вопрос: можно ли использовать только один запрос? В своей функции я использую два запроса в PrevClaim-View, чтобы проверить, находится ли Prev.Claim в критическом состоянии и имеет критический MaxActioncode.