子查询返回的值超过1。这是不允许的+触发错误

时间:2014-11-04 03:47:31

标签: sql sql-server triggers

首先让我们明白我正在做一个作业作业,它是本学期的第二章到最后一章,它是存储过程,函数和触发器。我已经完成了所有的功能和程序问题,但我正在努力解决触发器问题。对于这个问题,我尝试创建一个触发器,如果​​值为>,则不会让我更新名为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    

我为什么会收到此错误?

感谢您提前提供任何帮助。

3 个答案:

答案 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