Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 server 子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的?_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql server 子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的?

Sql server 子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的?,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我想在一个表中插入值后更新多个表和值,所以我创建了一个触发器。它可以很好地插入一行,但一旦插入更多行,SQL Server就会给出以下错误: 子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的 这是我的扳机: CREATE TRIGGER [dbo].[tbl_Sales_ForInsert] ON [dbo].[SALES] FOR INSERT AS BEGIN DECLARE @ITEMMODEL varchar(100) SELECT @ITEMMO

我想在一个表中插入值后更新多个表和值,所以我创建了一个触发器。它可以很好地插入一行,但一旦插入更多行,SQL Server就会给出以下错误:

子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的

这是我的扳机:

CREATE TRIGGER [dbo].[tbl_Sales_ForInsert]
ON [dbo].[SALES] 
FOR INSERT
AS
BEGIN
  DECLARE @ITEMMODEL varchar(100)

  SELECT @ITEMMODEL = ITEM_MODEL FROM inserted

  UPDATE SALES 
  SET PROFIT = TOTAL_PRICE - (SELECT QUANTITY FROM SALES WHERE ITEM_MODEL = @ITEMMODEL) * (SELECT RATE FROM ITEM_DETAILS WHERE ITEM_MODEL = @ITEMMODEL) 
  WHERE ITEM_MODEL = @ITEMMODEL

  UPDATE ITEM_DETAILS 
  SET QUANTITY = QUANTITY - (SELECT QUANTITY FROM SALES WHERE ITEM_MODEL = @ITEMMODEL) 
  WHERE ITEM_MODEL = @ITEMMODEL

  --UPDATE ITEM_DETAILS SET AMOUNT = AMOUNT - (SELECT RATE FROM ITEM_DETAILS WHERE ITEM_MODEL=@ITEMMODEL) * (SELECT QUANTITY FROM SALES WHERE ITEM_MODEL=@ITEMMODEL) where ITEM_MODEL=@ITEMMODEL
END
当我第一次在
SALES
表中插入数据时,更新成功,但第二次出现上述错误请记住
ITEM\u MODEL
是SALES表中的外键约束


我一直在遭受这个错误的折磨,有人能帮我吗?

您的基本缺陷是,您似乎希望触发器每行触发一次-这是而不是在SQL Server中。相反,触发器对每条语句触发一次,插入的伪表
可能包含多行

鉴于该表可能包含多行,您希望在此处选择哪一行

SELECT @ITEMMODEL = ITEM_MODEL FROM inserted
它未定义-您可能从插入的
中的任意行获取值

您需要重写整个触发器,因为插入的
包含多行!您需要使用基于集合的操作-不要期望插入的
中只有一行

因此,在您的情况下,您的触发代码应该如下所示:

CREATE TRIGGER [dbo].[tbl_Sales_ForInsert]
ON [dbo].[SALES] 
FOR INSERT
AS
BEGIN
   -- update the dbo.Sales table, set "PROFIT" to the difference of 
   -- TOTAL_PRICE and (QUANTITY * RATE) from the "Inserted" pseudo table
   UPDATE s
   SET s.PROFIT = i.TOTAL_PRICE - (i.QUANTITY * i.RATE) 
   FROM dbo.Sales s
   INNER JOIN Inserted i ON i.ITEM_MODEL = s.ITEM_MODEL

   -- update the dbo.ITEM_DETAILS table
   UPDATE id
   SET id.QUANTITY = id.QUANTITY - i.Quantity
   FROM dbo.ITEM_DETAILS id
   INNER JOIN Inserted i ON id.ITEM_MODEL = i.ITEM_MODEL
END

Marc_s认为插入的伪表包含多行是正确的。有些情况下,如果子查询仅限于一行(顶部为1),则查询可能会起作用


你的外键独特吗?我无法形容我有多感激你的回答。我在SQLServer上工作了很多年,一直认为并没有办法在有触发器的表中进行多次更新。但您展示了Insert可以有多行,SQL Server可以使用触发器在表上执行多个插入和更新。非常感谢你!!
  UPDATE SALES 
  SET PROFIT = TOTAL_PRICE - (SELECT TOP(1) QUANTITY FROM SALES WHERE ITEM_MODEL = @ITEMMODEL) 
  * (SELECT TOP(1) RATE FROM ITEM_DETAILS WHERE ITEM_MODEL = @ITEMMODEL) 
  WHERE ITEM_MODEL = @ITEMMODEL