首先让我们明白我正在做一个作业作业,它是本学期的第二章到最后一章,它是存储过程,函数和触发器。我已经完成了所有的功能和程序问题,但我正在努力解决触发器问题。对于这个问题,我尝试创建一个触发器,如果值为>,则不会让我更新名为DiscountPercent的表中的列。 100或者< 0.此外,如果值介于0和1之间,比如说它的.2那么它应该将该数字乘以100以使值为20.当我使用更新语句对其进行测试时,我得到以下错误...
程序产品_UPDATE,第115行
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
以下是触发器的代码......
CREATE TRIGGER Products_UPDATE
ON Products
AFTER UPDATE
AS
DECLARE @DiscountPercent DECIMAL(5,2)
SET @DiscountPercent = (SELECT DiscountPercent FROM Products)
IF @DiscountPercent < 0 OR @DiscountPercent > 100
PRINT 'Number must be between 0 and 100'
ELSE IF @DiscountPercent BETWEEN 0 And 1
UPDATE Products
SET DiscountPercent = @DiscountPercent * 100
这是我用来测试它的代码......
UPDATE Products
SET DiscountPercent = 0
WHERE ProductID = 17
我为什么会收到此错误?
感谢您提前提供任何帮助。
答案 0 :(得分:2)
每个语句触发一次触发器,这会影响许多行。使用inserted
表来标识更新的行,并使用基于集的查询而不是标量变量。以下是一个例子。将您的实际主键替换为ProductID
。
CREATE TRIGGER Products_UPDATE ON Products
AFTER UPDATE
AS
IF EXISTS ( SELECT *
FROM inserted
WHERE DiscountPercent < 0
OR DiscountPercent > 100 )
BEGIN
RAISERROR('Number must be between 0 and 100', 16, 1);
ROLLBACK;
END;
UPDATE Products
SET DiscountPercent = DiscountPercent * 100
WHERE ProductID IN ( SELECT ProductID
FROM inserted
WHERE DiscountPercent BETWEEN 0 AND 1 );
GO
答案 1 :(得分:1)
产品表有多行。所以你需要添加过滤器以获得所需的行。
set @d = (select top 1 DiscountPercent FROM Products)
select @d = DiscountPercent FROM Products
尝试这样的事情。
DECLARE @DiscountPercent DECIMAL(5, 2)
SELECT @DiscountPercent = DiscountPercent,
@id = ProductID
FROM inserted
IF @DiscountPercent < 0
OR @DiscountPercent > 100
PRINT 'Number must be between 0 and 100'
ELSE IF @DiscountPercent BETWEEN 0 AND 1
UPDATE Products
SET DiscountPercent = @DiscountPercent * 100
WHERE ProductID = @id
或
UPDATE A
SET A.DiscountPercent = B.DiscountPercent * 100
FROM Products A
JOIN inserted B
ON A.ID = B.id
答案 2 :(得分:0)
DECLARE @DiscountPercent DECIMAL(5,2)
SET @DiscountPercent = (SELECT DiscountPercent FROM Products)
你面临的错误是因为你设置了@discount中的值百分比是变量集操作符将一个值设置为另一个但是如果你通过select运算符执行此操作然后如果有多个值,那么它默认采取第一个值,所以你也可以通过这种方式做到这一点。
你必须改变SET @DiscountPercent = (SELECT DiscountPercent FROM Products)
TO
SELECT @DiscountPercent = DiscountPercent FROM Products