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

问题描述 投票:2回答:1

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

想象一下下面的表名为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  

这返回了几次qazxswpo。我知道这是一个丑陋的方法,对此问题的任何建议都非常感谢。

sql sql-server
1个回答
1
投票

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

您可以通过在查询字符串中声明变量来尝试此操作

Must declare the scalar variable "@amount".
© www.soinside.com 2019 - 2024. All rights reserved.