2010-07-08 3 views
0

Я застрял в создании хранимой процедуры, которая должна ежедневно обновлять вычисляемый столбец. К сожалению, мои знания о хранимых процедурах ограничены, но, похоже, это подходящее место. Я стараюсь дать больше справочной информации:Сохраненная процедура

Главный стол хранит претензии и называется 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

Может быть, что-то вроде следующих строк будет тем, что вы ищете?

UPDATE tabData TD1 
    SET TD1.IsReturn = 1 
    WHERE TD1.fimaxActionCode IN (1, ...etc... , 35) AND 
      NOT EXISTS (SELECT * 
          FROM tabData TD2 
          WHERE TD1.IMEI = TD2.IMEI AND 
           TD2.fimaxActionCode IN (8, ...etc... , 35) AND 
           TD2.fiClaimStatus IN (1, 4, 254, 255, 6) AND 
           TD2.Repair_Completion_Date > TD1.Repair_Completion_Date); 

Я считаю, что первым правилом является часть WHERE TD1.fimaxActionCode IN (1, ...etc... , 35). Запрос внутри NOT EXISTS предназначен для проверки второго правила. Если я немного ошибаюсь, вы можете увидеть свой путь к правильному решению. Если я полностью ошибаюсь ... э ...хорошо, мы попытаемся разобраться в чем-то, надеясь, что я не отправлю вас в неправильном направлении и потрачу ваше время.

Отредактировано, чтобы принять во внимание первый комментарий.

+0

Я уже дал мне ответ о том, как рассчитать правильное значение с помощью определенной пользователем функции. Поэтому мне нужно только проверить правильность 1 И _isClaimReturn (idData) = 1. Вы можете заполнить update-sql этими данными? Возможно, у вас также есть ответ на мой последний вопрос о множественных выборах в функции. В любом случае, спасибо :) –

1

Вы можете создать новый расчетный столбец, который использует UDF, который вы указали в своем редактировании. Это обеспечило бы, чтобы стоимость постоянно обновлялась.

+0

Спасибо за предложение. Но у меня есть еще одна проблема, что возвращаемое состояние должно быть заблокировано на дату закрытия (каждый месяц). Поэтому значение значения не должно обновляться после закрытия. Но я думаю, что знаю, что делать. –

+0

Кстати, вопрос происхождения, в котором кто-то предложил использовать хранимую процедуру вместо mdx-запроса (соображения производительности), был следующим: http://stackoverflow.com/questions/3194924/ssas-named-queries –