[英]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.