Хранимая процедура - PullRequest
0 голосов
/ 08 июля 2010

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

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.

Ответы [ 2 ]

1 голос
/ 08 июля 2010

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

1 голос
/ 08 июля 2010

Будет ли что-то в следующих направлениях быть тем, что вы ищете?

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 предназначен для проверки второго правила. Если я немного ошибаюсь, вы можете увидеть свой путь к правильному решению. Если я совершенно неправ ... э-э ... ну, мы попытаемся что-то уладить, надеясь, что я не отправлю вас в неправильном направлении и не потрачу впустую ваше время.

Отредактировано с учетом первого комментария.

...