Sql server 为什么使用光标时会得到重复记录?

Sql server 为什么使用光标时会得到重复记录?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我使用游标逐行从表中获取值,执行一些计算,然后将派生值存储到临时表中。对于原始表中的每条记录,临时表中应有一条记录,在本例中为39行。出于某种原因,我的临时表的行数是78行数的两倍,前39行是重复39次的同一条记录,随后的39行被正确计算 例如,前39行将在下面重复39次: 2006-02-28, 1, 12.13, 0.97, 0.038281, 1.0183812 然后从第40行开始,它正确地拾取 2006-03-31, 1.0183812, 50.15, 0.85, 0.054849,

我使用游标逐行从表中获取值,执行一些计算,然后将派生值存储到临时表中。对于原始表中的每条记录,临时表中应有一条记录,在本例中为39行。出于某种原因,我的临时表的行数是78行数的两倍,前39行是重复39次的同一条记录,随后的39行被正确计算

例如,前39行将在下面重复39次:

2006-02-28, 1, 12.13, 0.97, 0.038281, 1.0183812
然后从第40行开始,它正确地拾取

2006-03-31, 1.0183812, 50.15, 0.85, 0.054849, 1.016651561
2006-04-30, 1.016651561, 52.34, 0.45, 0.06516981, 1.032151
2006-05-31, 1.032151, 54.10, 0.62, 0.56196189, 1.016651561
等等

问题是:

DECLARE @fiscalPeriod smalldatetime,
        @openingUnits float,
        @divPrice money,
        @divFactor float,
        @drip float,
        @endingUnits float


DECLARE divCursor CURSOR FOR
SELECT [FiscalPeriod]
      ,[DivPrice]
      ,[DivFactor]
  FROM [dbo].[DividendPricing]
  ORDER BY FiscalPeriod

OPEN divCursor

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

SET @openingUnits = 1
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

SELECT FiscalPeriod = @fiscalPeriod, OpeningUnits = @openingUnits, DivPrice = @divPrice, DivFactor = @divFactor, DRIP = @drip, EndingUnits = @openingUnits + @drip
INTO #Temp
FROM DividendPricing

WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

SET @openingUnits = @endingUnits
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

INSERT INTO #Temp (FiscalPeriod, OpeningUnits, DivPrice, DivFactor, DRIP, EndingUnits)
VALUES (@fiscalPeriod, @openingUnits, @divPrice, @divFactor, @drip, @endingUnits)

END

CLOSE divCursor
DEALLOCATE divCursor

SELECT * FROM #Temp

DROP TABLE #Temp

选择。。。INTO Temp操作是将DividendPricing表+39中每行变量中的相同值插入Temp

然后循环循环循环并插入剩余的每一行+38

最后,因为在下一次获取之后有一个INSERT,所以即使下一次获取没有返回任何记录,也要进行插入+一,

我猜你的选择。。。INTO Temp实际上应该与循环末尾的INSERT相同

您应该重新组织SQL以获取循环之前的第二行,并将获取移到循环底部的旁边

DECLARE @fiscalPeriod smalldatetime,
        @openingUnits float,
        @divPrice money,
        @divFactor float,
        @drip float,
        @endingUnits float


DECLARE divCursor CURSOR FOR
SELECT [FiscalPeriod]
      ,[DivPrice]
      ,[DivFactor]
  FROM [dbo].[DividendPricing]
  ORDER BY FiscalPeriod

OPEN divCursor

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

SET @openingUnits = 1
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

INSERT INTO #Temp (FiscalPeriod, OpeningUnits, DivPrice, DivFactor, DRIP, EndingUnits)
VALUES (@fiscalPeriod, @openingUnits, @divPrice, @divFactor, @drip, @endingUnits)

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

WHILE @@FETCH_STATUS = 0
BEGIN
SET @openingUnits = @endingUnits
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

INSERT INTO #Temp (FiscalPeriod, OpeningUnits, DivPrice, DivFactor, DRIP, EndingUnits)
VALUES (@fiscalPeriod, @openingUnits, @divPrice, @divFactor, @drip, @endingUnits)

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

END

CLOSE divCursor
DEALLOCATE divCursor

SELECT * FROM #Temp

DROP TABLE #Temp

选择。。。INTO Temp操作是将DividendPricing表+39中每行变量中的相同值插入Temp

然后循环循环循环并插入剩余的每一行+38

最后,因为在下一次获取之后有一个INSERT,所以即使下一次获取没有返回任何记录,也要进行插入+一,

我猜你的选择。。。INTO Temp实际上应该与循环末尾的INSERT相同

您应该重新组织SQL以获取循环之前的第二行,并将获取移到循环底部的旁边

DECLARE @fiscalPeriod smalldatetime,
        @openingUnits float,
        @divPrice money,
        @divFactor float,
        @drip float,
        @endingUnits float


DECLARE divCursor CURSOR FOR
SELECT [FiscalPeriod]
      ,[DivPrice]
      ,[DivFactor]
  FROM [dbo].[DividendPricing]
  ORDER BY FiscalPeriod

OPEN divCursor

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

SET @openingUnits = 1
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

INSERT INTO #Temp (FiscalPeriod, OpeningUnits, DivPrice, DivFactor, DRIP, EndingUnits)
VALUES (@fiscalPeriod, @openingUnits, @divPrice, @divFactor, @drip, @endingUnits)

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

WHILE @@FETCH_STATUS = 0
BEGIN
SET @openingUnits = @endingUnits
SET @drip = @openingUnits/@divPrice*@divFactor
SET @endingUnits = @openingUnits + @drip

INSERT INTO #Temp (FiscalPeriod, OpeningUnits, DivPrice, DivFactor, DRIP, EndingUnits)
VALUES (@fiscalPeriod, @openingUnits, @divPrice, @divFactor, @drip, @endingUnits)

FETCH NEXT FROM divCursor
INTO @fiscalPeriod, @divPrice, @divFactor

END

CLOSE divCursor
DEALLOCATE divCursor

SELECT * FROM #Temp

DROP TABLE #Temp

您在临时选择中的初始插入是为DividendPricing中的每一行插入一行。我想您想删除FROM DividendPricing子句。

您最初在Temp中插入的SELECT into是为DividendPricing中的每一行插入一行。我想您想删除FROM DividendPricing子句。

您最初插入Temp的SELECT into是为DividendPricing中的每一行插入一行。我想您想删除FROM DividendPricing子句。@bokokeith就是这样,请回答,我会将其标记为正确。您最初插入Temp中的SELECT into是为DividendPricing中的每一行插入一行。我想你想删除FROM DividendPricing子句。@BoCoKeith就是这样,做一个答案,我会把它标记为正确的。下一次获取后插入的内容捕捉得很好。重新排序将删除最后一个重复的行。唯一的问题是,将SELECT INTO替换为INSERT时,不会创建临时表,脚本也会失败。否则就行了,谢谢!下一次取回后插入的内容捕捉良好。重新排序将删除最后一个重复的行。唯一的问题是,将SELECT INTO替换为INSERT时,不会创建临时表,脚本也会失败。否则就行了,谢谢!