消息512,级别16,状态1,过程trg_pricebase,第13行子查询返回的值超过1

时间:2015-06-27 11:12:40

标签: sql sql-server sql-server-2008 triggers

  

如何解决这种探测请帮助我:

错误:

  

Msg 512,Level 16,State 1,Procedure trg_pricebase,Line 13 Subquery返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。声明已经终止。

我的触发器是:

ALTER TRIGGER [dbo].[trg_pricebase]
ON  [dbo].[tbl_model2]        
AFTER UPDATE
AS 
   BEGIN

                DECLARE @price_base NVARCHAR(50) = (SELECT tbl_model2.price_base FROM tbl_model2)
                DECLARE @tipid  int = (SELECT tbl_model2.id FROM tbl_model2)


                INSERT INTO tbl_price_history (tbl_price_history.price_base,tbl_price_history.tipid)
                VALUES (@price_base, @tipid )

    END

3 个答案:

答案 0 :(得分:1)

我的通灵能力告诉我你想要

alter trigger[dbo].[trg_pricebase] on [dbo].[tbl_model2]after update as 
begin
    insert into dbo.tbl_price_history (
        price_base,
        tipid
    ) select
        price_base,
        id
    from
        inserted
end

你有两个基本问题。 首先,要仅读取受update语句影响的行,请使用inserteddeleted伪表。 其次,触发器可以触发多行,你不能假设只有一行受影响。

答案 1 :(得分:0)

执行以下[sub]查询以查看哪个查询返回多行:

SELECT tbl_model2.price_base FROM tbl_model2
SELECT tbl_model2.id FROM tbl_model2

我假设您要在*历史记录表中插入旧值(删除表格)或新值(插入表格):

ALTER TRIGGER [dbo].[trg_pricebase]
ON  [dbo].[tbl_model2]        
AFTER UPDATE
AS 
BEGIN
    INSERT  INTO tbl_price_history (price_base, tipid)
    SELECT  price_base, tipid
    FROM    deleted -- for old values
    -- or FROM  inserted -- for new values
END

参考文献:inserted and deleted table

答案 2 :(得分:0)

在为变量赋值时,不应该使用查询中所遵循的方法。

DECLARE @price_base NVARCHAR(50) = (SELECT tbl_model2.price_base FROM tbl_model2)

括号内的select语句返回一个结果集,而不是单个值,它不能存储到变量中(表数据类型变量除外)。不要练习这种方法,这总会导致错误。

你应该总是使用

select top 1 @price_base = price_base FROM tbl_model2

当您插入多行时,将值分配给触发器内的变量会导致您丢失数据。