【发布时间】:2015-02-21 11:16:36
【问题描述】:
我的存储过程有问题。它应该从给定位置添加所有子项、子项等的值并返回它。目前它返回的只是NULL。
这是一个将使用存储过程的表的示例。
稍后我也想在存储过程中实现运算符 Bool。如果是NULL,则计算中忽略saldo。如果为 0,则负向使用 saldo,如果为 1,则正向使用 saldo。
id pos operpos saldo operator
-------------------------------------------------
1 blue NULL NULL NULL
2 lightblue blue NULL 1
3 darkblue blue 25.00 1
4 skyblue lightblue 12.00 1
5 babyblue lightblue -12.00 0
6 greyblue lightblue 22.00 1
7 royalblue darkblue 121.00 1
8 navyblue darkblue 20.00 1
9 sailorsblue navyblue 23.00 0
10 captainsblue navyblue 33.00 1
这是calctotal(darkblue) 的存储过程应该计算的:
darkblue +25
royalblue +121
navyblue +20
sailorsblue -23 //because operator = 0
captainsblue +33
OUTPUT 176
这是我目前拥有的存储过程:
ALTER PROCEDURE [dbo].[calctotal]
//DECLARE INPUT AND OUTPUT
@number nvarchar(255),
@total NUMERIC(20,2) OUTPUT
AS
BEGIN
//DECLARE THE VARIABLES
DECLARE @pos NVARCHAR(255) = NULL;
DECLARE @saldo NUMERIC(20,2) = NULL;
DECLARE @tmptotal NUMERIC(20,2)
DECLARE @tmptotal2 NUMERIC(20,2) = 0;
//LOAD DATA INTO CURSOR
DECLARE cur CURSOR LOCAL for
SELECT pos, saldo
FROM test
WHERE operpos = @number
//START CURSOR AND FETCH NEXT
OPEN CUR
FETCH NEXT FROM CUR INTO @pos, @tmptotal2
//WHEN NEW ITEM HAS BEEN LOADED
WHILE @@FETCH_STATUS = 0
BEGIN
//ADD VALUE TO TMPTOTAL
SET @tmptotal = @tmptotal2 + @tmptotal;
//RECURSIVE PART SO FUNCTION APPLIES TO CHILDREN
EXEC calctotal @pos, @tmptotal;
END;
close cur
deallocate cur
//THE OUTPUT OF TOTAL IS SET TO THE VALUE OF THE VARIABLE
SET @total = @tmptotal;
END
你们对代码可能有什么问题和/或如何纠正它有什么想法吗?对于如何实现运算符布尔值的任何提示,我将非常高兴!
提前感谢您的帮助
编辑:我使用的是 SQL Server 2012
【问题讨论】:
-
首先,请不要使用 CURSORS !它们对生产非常不利,其次,您能否根据上述定义向我们提供您希望最终结果看起来如何的示例数据?目前很混乱。谢谢
-
@Claudio 很抱歉不清楚。我在帖子中添加了和进行计算。
-
@Claudio 我不确定我还能如何将层次结构中的所有值递归地获取到输出中。这就是我使用游标的原因。您对使用什么而不是游标有什么建议,以便解析每个子项的值?
-
是的,我正在尝试提出解决方案,现在正在进行测试。
标签: database tsql stored-procedures recursion sql-server-2012