Ряд проблем и сюрпризов в том, что вы пытаетесь запустить здесь.Но в принципе, не пытайтесь выполнить процедурные шаги, когда вы имеете дело с сетами .inserted
может содержать 0, 1 или несколько строк, так что , какой запас строки вы спрашиваете в вашей IF
?
Лучше иметь дело с этим вWHERE
предложение:
CREATE TRIGGER [IfStockIsNull]
ON [dbo].[Products]
FOR INSERT, UPDATE --Removed DELETE, because ?!?
AS
BEGIN
UPDATE [Products] SET [Stock] = 1
FROM [Products] AS m
INNER JOIN inserted AS i
ON m.ProductId = i.ProductId;
WHERE m.Stock = 0
--Not sure what the error is for - the above update may have updated
--some number of rows, between 0 and the number in inserted.
--What circumstances should produce an error then?
END
Простой демонстрационный скрипт, в котором UPDATE
равен , правильно ориентируясь только на соответствующие строки из inserted
:
declare @t table (ID int not null, Val int not null)
insert into @t(ID,Val) values (1,1),(2,2),(3,3)
update
@t
set
Val = 4
from
@t t
inner join
(select 2 as c) n
on
t.ID = n.c
select * from @t
Показывает, что обновляется только строка с ID
из 2
.
Даже собственный пример от Microsoft из UPDATE ... FROM
синтаксис использует UPDATE <table> ... FROM <table> <alias> ...
синтаксис, который утверждает Гордон, не работает:
USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
ON sp.BusinessEntityID = so.SalesPersonID
AND so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = sp.BusinessEntityID);
GO
В этом примере действительно есть проблема, которая дополнительно объяснена ниже, но которая связана с "множественными совпадающими строками в других таблицах, приведет кнедостаток только в одном обновлении, о котором должен знать каждый, кто работает с UPDATE ... FROM
.