首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储过程

存储过程
EN

Stack Overflow用户
提问于 2010-07-08 15:22:41
回答 2查看 298关注 0票数 0

我一直在创建一个存储过程,它应该每天更新计算过的列。不幸的是,我对存储过程的了解有限,但似乎是正确的地方。我试着提供更多的背景信息:

主表存储声明,称为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‘,它选择了所有以前的声明:

代码语言:javascript
复制
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验证此声明):

代码语言:javascript
复制
SELECT     TOP (1) ClaimID, PrevClaimID, IMEI, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM         PrevClaim
WHERE     (ClaimID = 44921287)
ORDER BY PrevClaimRepDate DESC

但是,现在我不知道该如何/在哪里检查这个父请求是否在规则2上失败了。如果我修改这个sql并将条件放入where子句中,我将得到错误的声明(考虑有4个父请求,最后一个及时的声明是可以的,但是第四个请求失败了,因此我将得到第四个请求,但是必须与最后一个声明进行检查):

代码语言:javascript
复制
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-语句中更新整个表。以下用户定义的函数为我提供了正确的值:

代码语言:javascript
复制
    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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-08 16:23:27

你所要寻找的,会是以下几条线索吗?

代码语言:javascript
复制
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,我们会尝试解决一些问题,希望我不会让你走错方向,浪费你的时间。

编辑时考虑到了第一个评论。

票数 1
EN

Stack Overflow用户

发布于 2010-07-08 17:55:13

您可以创建一个新的计算列,该列使用编辑中列出的UDF。这将确保价值始终是最新的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3205185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档