我正在尝试创建一个应该检查是否存在行的sql脚本。如果一个不存在,我想创建一个,如果确实存在,我想更新它。
但是,在我的下面的代码中,INSERT行会引发以下错误:
视图或函数''不可更新,因为修改会影响多个基表。
有没有办法找出这会影响哪些其他基表以及如何实现我的目标?
SQL代码:
IF NOT EXISTS (SELECT * FROM g4b_stockcountsummary
WHERE g4b_stockcountid = @scid AND g4b_protoproductid = @ppid)
BEGIN
--stock count data doesn't exist for the given product/stock count, create new record
SET @difference = @count - @expectedtotal
INSERT INTO g4b_stockcountsummary (g4b_stockcountsummaryid, g4b_stockcountid, g4b_protoproductid, g4b_expectedtotal, g4b_counttotal, g4b_difference)
VALUES (NEWID(), @scid, @ppid, @expectedtotal, @count, @difference)
END
ELSE
BEGIN
--stock count data already exists for the given product/stock count, update record
DECLARE @originalcount INT
SET @originalcount = (SELECT g4b_counttotal FROM g4b_stockcountsummary
WHERE g4b_stockcountid = @scid AND g4b_protoproductid = @ppid)
SET @count = @originalcount + @count
SET @difference = @count - @expectedtotal
UPDATE g4b_stockcountsummary
SET g4b_expectedtotal = @expectedtotal,
g4b_counttotal = @count,
g4b_difference = @difference
WHERE g4b_stockcountid = @scid
AND g4b_protoproductid = @ppid
END
答案 0 :(得分:6)
g4b_stockcountsummary
是一个观点。视图可以可更新,但仅限于某些条件。它们列在documentation中,然后开始:
可更新视图
您可以通过视图修改基础基表的数据,如 只要满足以下条件:
- 任何修改(包括
UPDATE
,INSERT
和DELETE
语句都必须仅引用一个基表中的列。
因此,你无法做你想做的事。您需要修复视图或单独更新每个基表。
我应该指出lad2025是正确的。您可以在视图上使用instead of
触发器来支持update
。文档指的是视图的基本更新。