光标内的光标:替代?

时间:2015-02-02 16:42:57

标签: sql-server cursor

所以,我有以下问题:

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

范围信息的范围百分比为1 - N(IE: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 

2 个答案:

答案 0 :(得分:0)

正如我在上面评论的那样,很难确切地知道你想要做什么,但这样做会得到你需要的数据吗?

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子句来帮助防止意外的交叉连接。

答案 1 :(得分:0)

为清楚起见,这是我留下的评论的一个例子。

基本上,尝试通过在临时表中创建相同的填充来完全删除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