光标创建
Cursor creation
我有 2 个 table:
Tresent-JanOrg(费率、数量)
Rate (2, 5, 7)
Qty (3, 7, 7)
温度 (JanOrg)
Pkid JanOrg FebOrg MarOrg
1 2 0 0
我必须计算 3 次(Tresent 中的 3 行)才能计算
JanOrg = (JanOrg * Qty * Rate) / 100
然后应在 janorg
下的临时 table 中更新 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
有了这个 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
Returns 值为 1.8000。
绝对不需要光标
一个非常简单的 set-based 语句就可以完成这一切——而且比任何 RBAR 都快得多(逐行- agonizing-row) 用游标或 while 循环处理....
我同意最好在没有游标的情况下执行此操作,但我认为问题的根源在于您的代码正在执行整数数学运算。
试试这两个:
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)
第一个returns0,第二个returns1.24.
如果您需要浮点运算,请确保所有 values/variables 都是浮点数。如果你有一个 int 变量,你可以进行转换。例如:
DECLARE @i int
SET @i = 2
SELECT 5.0 / CAST(@i AS float)
我有 2 个 table:
Tresent-JanOrg(费率、数量)
Rate (2, 5, 7)
Qty (3, 7, 7)
温度 (JanOrg)
Pkid JanOrg FebOrg MarOrg
1 2 0 0
我必须计算 3 次(Tresent 中的 3 行)才能计算
JanOrg = (JanOrg * Qty * Rate) / 100
然后应在 janorg
下的临时 table 中更新 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
有了这个 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
Returns 值为 1.8000。
绝对不需要光标
一个非常简单的 set-based 语句就可以完成这一切——而且比任何 RBAR 都快得多(逐行- agonizing-row) 用游标或 while 循环处理....
我同意最好在没有游标的情况下执行此操作,但我认为问题的根源在于您的代码正在执行整数数学运算。
试试这两个:
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)
第一个returns0,第二个returns1.24.
如果您需要浮点运算,请确保所有 values/variables 都是浮点数。如果你有一个 int 变量,你可以进行转换。例如:
DECLARE @i int
SET @i = 2
SELECT 5.0 / CAST(@i AS float)