매일 계산 된 열을 업데이트해야하는 저장 프로 시저를 만드는 데 어려움을 겪고 있습니다. 아쉽게도 저장 프로 시저에 대한 지식이 제한되어 있지만 올바른 위치에있는 것으로 보입니다. 배경 정보를 더 제공하려고합니다 :저장 프로 시저
메인 테이블은 claim을 저장하며 tabData라고 불립니다. 그것은 데이터 유형이 bit (boolean) 인 컬럼 'IsReturn'을가집니다.
1.Rule : 클레임은 해당 열 값 fimaxActionCode가 1, 2, 3, 4, 5, 8, 9, 12, 14, 17, 18, , 22, 23, 24, 25, 30, 31, 32, 35
2.Rule는 : 그 날짜 값 및 IMEI 통해 식별 한 항을 (갖는 경우 제는 하지 반송이며 fiClaimeStatus 1, 4, 6, 254에서 fimaxActionCode가 8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37 인 , 255.
첫 번째 리턴 규칙은 이전 규칙이었고 는 ssas 큐브에서 계산 된 열로 구현됩니다. 이제는 상황이 더 복잡해 졌기 때문에 매일 아침 실행되는 저장 프로 시저에 계산을 넣는 것이 더 좋을 것이라고 생각했습니다.
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
내가 얻을 수 있습니다 : 내가보기 이전의 모든 주장을 선택 'PrevClaim'를 만든 :
이
내가이 후보의 주장 (규칙 1) 규칙이 실패하는지 확인해야합니다 것입니다 이 SQL 문에 주어진 ID에 대한 마지막 부모 - 주장 (이 주장은 규칙 2에 대해 검증해야 함) :SELECT TOP (1) ClaimID, PrevClaimID, IMEI, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM PrevClaim
WHERE (ClaimID = 44921287)
ORDER BY PrevClaimRepDate DESC
하지만 지금 나는이 부모 주장은 주장이라면 어디 확인하는 방법/잘 모릅니다 그 규칙 2에 실패합니다.이 SQL을 수정하고 조건을 where에 넣으면
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
: 절 내가 잘못된 주장을 얻을 것이다 (4 부모의 주장은, 시간에 마지막으로 확인하지만 네 번째 그러므로 내가 네 번째 다시 얻을 것이다하지만 마지막에 확인해야 실패가 고려) 나는 서클에 간다. 아니면 어쩌면 그렇게 뜨거운 것일 수도있다. 누군가 나를 올바른 방향으로 이끌 수 있고 스토어드 프로 시저 (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을 완성 할 수 있습니까? 어쩌면 당신은 또한 함수에서 다중 선택에 대한 나의 마지막 질문에 대한 답을 얻을 수 있습니다. 어쨌든 고마워요 :) –