如何解决这种探测请帮助我:
错误:
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
答案 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语句影响的行,请使用inserted
和deleted
伪表。
其次,触发器可以触发多行,你不能假设只有一行受影响。
答案 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
答案 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
当您插入多行时,将值分配给触发器内的变量会导致您丢失数据。