SQL根据库存和交易计算余额

时间:2017-12-18 14:22:39

标签: sql sql-server

我正在创建一个计算用户库存状态的存储过程。

想象一下名为user_inventory的下表有许多编号列:

id_inventory    id_user    0    1    2    3
------------    -------    -    -    -    -
           2          4    5    0    14   21

另一个叫user_transactions

id_tran    id_user   0    1    2    3
-------    -------   -    -    -    -
     54          4   1    0    3    7
     55          4   2    0    9    8
     56          4   1    0    2    4

我想要的是一种在减去所有用户交易总和之后计算每列剩余库存状态的方法,如下所示:

id_availableInventory    id_user    0    1    2    3
---------------------    -------    -    -    -    -
                    2          4    1    0    0    2

另外一个障碍是标有0到499的列。

我尝试使用while循环并使用动态sql和SUM()一次更新一列,但同时存在范围和性能问题 - 而且我不确定这是否是一个很好的方法问题。我正在使用SQL Server 2012.

DECLARE @counter int  
DECLARE @userid int
DECLARE @amount int
DECLARE @sum int
declare @sql nvarchar(1000)
SET @counter = 0  
SET @userid = 4 
WHILE @counter < 500  
BEGIN   
    set @sql = 'SELECT @amount = [' + CAST(@counter AS nvarchar) + '] FROM user_inventory WHERE ID_User = ' +CAST(@userid AS nvarchar)
    EXEC(@sql)
    set @sql = 'SELECT @sum = SUM([' + CAST(@counter AS nvarchar) + ']) FROM user_transactions WHERE ID_User = ' +CAST(@userid AS nvarchar)
    EXEC(@sql)
    set @sql = 'UPDATE user_availableinventory SET [' + CAST(@counter AS nvarchar) + '] = @amount - @sum WHERE ID_User = ' +CAST(@userid AS nvarchar)
    EXEC(@sql)
    SET @counter = @counter + 1  
END  

多次返回Must declare the scalar variable "@amount".次。 我知道这是一个丑陋的方法,对这个问题的任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

您收到错误是因为您正在使用变量范围之外的变量。查询字符串作为单独的会话执行,因此您需要在查询字符串中声明变量。

您可以通过声明查询字符串

中的变量来尝试此操作
DECLARE @counter int  
DECLARE @userid int
declare @sql nvarchar(1000)
SET @counter = 0  
SET @userid = 4 
WHILE @counter < 500  
BEGIN   
    set @sql = '
    DECLARE @sum int  
    DECLARE @amount int

    SELECT 
        @amount = [' + CAST(@counter AS nvarchar) + '] 
        FROM user_inventory WHERE ID_User = ' +CAST(@userid AS nvarchar)+'

    SELECT 
        @sum = SUM([' + CAST(@counter AS nvarchar) + ']) 
        FROM user_transactions WHERE ID_User = ' +CAST(@userid AS nvarchar)+'

    UPDATE user_availableinventory SET [' + CAST(@counter AS nvarchar) + '] = @amount - @sum WHERE ID_User = ' +CAST(@userid AS nvarchar)

    EXEC(@sql)
    SET @counter = @counter + 1  

END