繁体   English   中英

光标内的光标:替代?

[英]Cursor inside cursor: Alternative?

所以,我有以下问题:

我有4个表格:范围信息,范围百分比,DGRange和SGRange

范围信息的范围百分比为1-N(即:N百分比为1范围)

DGRange和SGRange都将这两个表连接到其他外部字体。

不应该这样。 但这就是系统的构建方式,现在我只能解决这个愚蠢决定中出现的问题。

无论如何,我们发现DGRange和SGRange在不应该指向相同的主键的时候,因此,一旦系统更改了该范围内的任何信息,就会破坏系统中的其他内容。 因此,我必须找出每一次有此重复项( 非常容易做到),并在RangeInformation / RangePercentage上复制整个记录,并将其中之一指向新记录。

我的问题是,现在我正在考虑在游标中使用游标,并且我相信可以有一种更简单的方法。

有没有更好的办法?

DECLARE @range nvarchar(10) 
DECLARE @rangeinfoid nvarchar(10)
DECLARE @lowerlimit money
DECLARE @Upperlimit money
DECLARE @CurrentYear smallint
DECLARE @Percentage float

DECLARE subgroup_cursor CURSOR FOR  
SELECT distinct a.RangeInformationId
FROM SubgroupRange a, DiscountGroupRange b
where a.RangeInformationId = b.RangeInformationId

DECLARE rangeperc_cursor CURSOR FOR  
SELECT  CurrentYear,
    Percentage
    from RangePercentage 
    where RangeInformationId = @range

OPEN subgroup_cursor  
FETCH NEXT FROM subgroup_cursor INTO @range  



WHILE @@FETCH_STATUS = 0  
BEGIN  
   select   @rangeinfoid = RangeInformationId , 
            @lowerlimit = LowerLimit, 
            @Upperlimit = UpperLimit
   from RangeInformation 
   where RangeInformationId = @range

   --Add insert here

   OPEN rangeperc_cursor
   FETCH NEXT FROM subgroup_cursor INTO @CurrentYear, @Percentage

   WHILE @@FETCH_STATUS = 0
    BEGIN
    print(@CurrentYear)
    print(@Percentage)
    --Add insert here
    FETCH NEXT FROM rangeperc_cursor INTO @CurrentYear, @Percentage
    END


   FETCH NEXT FROM subgroup_cursor INTO @range
END  

CLOSE subgroup_cursor  
DEALLOCATE subgroup_cursor 

CLOSE rangeperc_cursor  
DEALLOCATE rangeperc_cursor 

正如我在上面评论的那样,很难确切地知道您要做什么,但是这样的事情会为您获取所需的数据吗?

select ri.RangeInformationId
    , ri.LowerLimit
    , ri.UpperLimit
from RangeInformation ri
join SubgroupRange sr on sr.RangeInformationId = ri.RangeInformationId
join DiscountGroupRange dgr on dgr.RangeInformationId = sr.RangeInformationId

您确实应该养成这种加入方式的习惯。 这是一个更简洁的代码明智的选择,并且通过忘记将联接谓词作为where子句来帮助防止意外的交叉联接。

为了清楚起见,这是我留下的评论示例。

本质上,尝试通过在临时表中创建相同的填充来完全删除subgroup_cursor

DECLARE @rangeinfoid int
DECLARE @CurrentYear smallint
DECLARE @Percentage float



CREATE TABLE #temp_subgroup
(
  RangeInformationID int
)
INSERT INTO #temp_subgroup
(RangeInformationID)
SELECT distinct a.RangeInformationId
FROM SubgroupRange a, DiscountGroupRange b
where a.RangeInformationId = b.RangeInformationId

DECLARE rangeperc_cursor CURSOR FOR  
SELECT  CurrentYear,
    Percentage,
    RangeInformationID
    from RangePercentage 
    where RangeInformationId IN (SELECT RangeInformationID FROM #temp_subgroup)

OPEN rangeperc_cursor 
WHILE (@@FETCH_STATUS <> 0)
     BEGIN
       FETCH NEXT FROM rangeperc_cursor INTO @rangeinfoid, @CurrentYear, @Percentage
          CREATE TABLE #temp_rangeupdate
          (
             RangeInformationID int,
             LowerLimit money,
             UpperLimit money
          )
          INSERT INTO #temp_rangeupdate
          ( RangeInformationID, LowerLimit, UpperLimit)
          SELECT RangeInformationID,
                 LowerLimit,
                 UpperLimit
          FROM RangeInformation
          WHERE RangeInformationID = @rangeinfoid



          -- UPDATE/INSERT #temp_rangeupdate
          -- UPDATE/INSERT Production Tables from #temp_rangeupdate

DROP TABLE #temp_rangeupdate

END
DROP TABLE #temp_subgroup
CLOSE rangeperc_cursor
DEALLOCATE rangeperc_cursor

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM