我正在创建一个计算用户库存状态的存储过程。
想象一下下面的表名为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。我知道这是一个丑陋的方法,对此问题的任何建议都非常感谢。
您收到错误是因为您正在使用变量范围之外的变量。查询字符串作为单独的会话执行,因此您需要在查询字符串中声明变量。
您可以通过在查询字符串中声明变量来尝试此操作
Must declare the scalar variable "@amount".