光标创建

时间:2016-02-26 20:07:45

标签: sql database sql-server-2012 cursor

我有两张桌子:

Tresent-JanOrg(Rate,Qty)

Rate (2, 5, 7)
Qty  (3, 7, 7)

Temp(JanOrg)

Pkid JanOrg FebOrg MarOrg
1     2        0     0

我必须进行3次计算(Tresent中有3行)来计算

JanOrg = (JanOrg * Qty * Rate) / 100 

然后应在janorg

下的临时表中更新janorg的总数

逻辑上

JanOrg = ((2 * 2 * 3) / 100) + ((2 * 5 * 7) / 100) + ((2 * 3 * 7) / 100)))

我正在尝试在SQL Server 2012中使用游标,但它没有返回正确的结果

我可以建议更好的方法来执行这些计算,因为我尝试了以下代码:

OPEN complex_cursor

FETCH NEXT FROM complex_cursor INTO @rate, @qty

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE #temp 
    SET JANORG = (JANORG * @rate * @qty) / 100 

    FETCH NEXT FROM complex_cursor INTO @rate, @qty
END

CLOSE complex_cursor
DEALLOCATE complex_cursor

2 个答案:

答案 0 :(得分:0)

使用此SELECT,您可以看到有问题的值 - 您认为这些值是否正确?

SELECT 
    tjo.*, temp.JanOrg,
    (1.0 * tjo.Rate * tjo.Qty * temp.JanOrg) / 100.0
FROM 
    dbo.TresentJanOrg tjo
CROSS APPLY 
    dbo.TempJanOrg temp

输出:

Rate   Qty   JanOrg (No column name)
------------------------------------
  2     3      2       0.120000
  5     7      2       0.700000
  7     7      2       0.980000

如果你总结这三个值,你应该得到你想要的东西:

DECLARE @Result DECIMAL(10,4)

SELECT @result = SUM((1.0 * tjo.Rate * tjo.Qty * temp.JanOrg) / 100.0)
FROM dbo.TresentJanOrg tjo
CROSS APPLY dbo.TempJanOrg temp

SELECT @result

返回 1.8000 的值。

绝对没有需要的消费者

一个非常简单的基于集合的语句可以完成所有操作 - 并且比使用游标的任何 RBAR (逐行激动行)处理快得多或者一会儿......

答案 1 :(得分:0)

我同意最好在没有光标的情况下这样做,但我相信问题的根源在于您的代码正在进行整数数学运算。

试试这两个:

SELECT ((2 * 2 * 3) / 100) + ((2 * 5 * 7) / 100)+((2 * 3 * 7) / 100)
SELECT ((2.0 * 2.0 * 3.0) / 100.0) + ((2.0 * 5.0 * 7.0) / 100.0)+((2.0 * 3.0 * 7.0) / 100.0)

第一个返回0,第二个返回1.24。

如果您想要浮点数学,请确保所有值/变量都是浮点数。如果你有一个int变量,你可以强制转换。例如:

DECLARE @i int
SET @i = 2
SELECT 5.0 / CAST(@i AS float)