Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL触发器添加两列的值并将其存储在第三列中_Sql_Sql Server_Triggers - Fatal编程技术网

SQL触发器添加两列的值并将其存储在第三列中

SQL触发器添加两列的值并将其存储在第三列中,sql,sql-server,triggers,Sql,Sql Server,Triggers,我有一个表,有三列,分别是pqty、prqty和balqty。 我想做的是,必须添加pqty和prqty的值。然后它应该存储在balqty中。插入或更新此表时,每一行都必须有效。 我用了这个扳机,它有时有效,大多数时候无效。我不知道为什么 CREATE TRIGGER tsl on stockledger FOR update AS declare @pqty int, @prqty int; select @pqty=i.pqty from inserted i; select @prqty=

我有一个表,有三列,分别是pqty、prqty和balqty。 我想做的是,必须添加pqty和prqty的值。然后它应该存储在balqty中。插入或更新此表时,每一行都必须有效。 我用了这个扳机,它有时有效,大多数时候无效。我不知道为什么

CREATE TRIGGER tsl on stockledger
FOR update
AS declare @pqty int, @prqty int;
select @pqty=i.pqty from inserted i;
select @prqty=i.prqty from inserted i;
update Stockledger set balqty = (@pqty - @prqty) 
PRINT 'AFTER Update trigger fired.'

我认为这不是一个好的使用触发器。相反,如果你有能力,考虑使用一个计算列(持续增强性能):


我认为这不是一个好的使用触发器。相反,如果你有能力,考虑使用一个计算列(持续增强性能):


update语句更新所有记录。您不希望这样。它不起作用,因为
inserted
是一个表。它包含多行,每一行可能具有不同的
pqty
prqty
值。见鬼,你的两个
select@local\u variable=…
语句甚至不能保证在一行中得到一致的值。千万不要在任何条件下设置插入到关联变量中的值形式,。在samet Transaction中经常会有多个记录,即使现在没有,最终也会有。SQL server不会在触发器中逐行处理。update语句会更新所有记录。您不希望这样。它不起作用,因为
inserted
是一个表。它包含多行,每一行可能具有不同的
pqty
prqty
值。见鬼,你的两个
select@local\u variable=…
语句甚至不能保证在一行中得到一致的值。千万不要在任何条件下设置插入到关联变量中的值形式,。在samet Transaction中经常会有多个记录,即使现在没有,最终也会有。SQL server不处理触发器中的逐行操作。这比触发器解决方案要好得多。我要指出,虽然上面的代码表明OP正在进行减法,但文本中说他想进行加法。因此,如果你真的想添加,在创建持久化列时使用a+,而不是a-。这比触发器解决方案要好得多。我要指出的是,虽然上面的代码表明OP正在进行减法,但文本中说他想添加。因此,如果您真的想添加,请在创建持久化列时使用+而不是-。
ALTER TABLE StockLedger DROP COLUMN balqty;
ALTER TABLE StockLedger ADD COLUMN balqty AS pqty - prqty PERSISTED;