Я застрял в создании хранимой процедуры, которая должна ежедневно обновлять вычисляемый столбец. К сожалению, мои знания о хранимых процедурах ограничены, но, похоже, это подходящее место. Я стараюсь дать больше справочной информации:Сохраненная процедура
Главный стол хранит претензии и называется tabData. Он имеет столбец «IsReturn» с битом типа данных (boolean).
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.Rule: требование является не на возврат, когда он имеет предыдущую заявку (идентифицированный через значения даты и IMEI (Id-Number для мобильных телефонов) с fimaxActionCode 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: Я создал View «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
я могу получить последний родитель претензии для данного ID с этим SQL-заявления (это требование должно быть подтверждено против Правило 2):
SELECT TOP (1) ClaimID, PrevClaimID, IMEI, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM PrevClaim
WHERE (ClaimID = 44921287)
ORDER BY PrevClaimRepDate DESC
Но теперь я не знаю, как/где, чтобы проверить, если этот родитель требование было утверждение, что не выполняется в правиле 2. Если я изменю этот sql и поставлю условие в Предложение я получу неправильные претензии (считаем, что существует 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
Я собираюсь в кругах или, может быть, слишком жарко для чего-то подобного. Надеюсь, кто-то может привести меня в правильном направлении и/или показать мне способ, как реализовать его в хранимой процедуре (UPDATE ... CASE, но как?).
EDIT: Думаю, я сейчас на правильном пути. Может быть, кто-нибудь может показать мне, как обновить всю таблицу в одном 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.
Я уже дал мне ответ о том, как рассчитать правильное значение с помощью определенной пользователем функции. Поэтому мне нужно только проверить правильность 1 И _isClaimReturn (idData) = 1. Вы можете заполнить update-sql этими данными? Возможно, у вас также есть ответ на мой последний вопрос о множественных выборах в функции. В любом случае, спасибо :) –