我一直在创建一个存储过程,它应该每天更新计算过的列。不幸的是,我对存储过程的了解有限,但似乎是正确的地方。我试着提供更多的背景信息:
主表存储声明,称为tabData。它有一个列'IsReturn‘与数据类型位(布尔型)。
1 .规则:当其列值fimaxActionCode为1、2、3、4、5、8、9、12、14、17、18、20、21、22、23、24、25、30、31、32、35之一时,索赔就是返回。
2.规则:在fiClaimeStatus 1、4、6、254、255中,如果有以前的索赔(通过日期值和IMEI(移动电话的Id号)标识),且fimaxActionCode为8、10、11、13、19、23、24、26、27、28、29、30、33、34、36、37,则索赔是而不是。
第一个返回规则是旧的,并作为计算列实现在我们的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-语句获得一个给定ID的最后一个父级声明(必须根据规则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上使用两个查询来检查Prev.Claim是否处于临界状态,是否具有临界MaxActioncode。
发布于 2010-07-08 16:23:27
你所要寻找的,会是以下几条线索吗?
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)部分。“不存在”中的查询旨在检查第二条规则。如果我稍微错了一点,你也许能找到正确的解决方案。如果我完全是wrong...er...well,我们会尝试解决一些问题,希望我不会让你走错方向,浪费你的时间。
编辑时考虑到了第一个评论。
发布于 2010-07-08 17:55:13
您可以创建一个新的计算列,该列使用编辑中列出的UDF。这将确保价值始终是最新的。
https://stackoverflow.com/questions/3205185
复制相似问题