Sql server 子查询返回了多个值。当子查询follow=或子查询用作表达式时,这是不允许的?
我想在一个表中插入值后更新多个表和值,所以我创建了一个触发器。它可以很好地插入一行,但一旦插入更多行,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
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