更新触发器,添加不能正常工作
Update trigger, add not working properly
提前为我的英语道歉,这是问题所在:因为我无法考虑触发器的逻辑,底线是有 2 个 table:
- material 列表
- 到达日记
将记录添加到教区杂志中的 table 时,应运行触发器检查 table 是否为空添加新条目(Material,库存数量), 如果 table 有记录则在 Material = (select the part Name From inserted)
的条件下更新它们,但如果 table 有记录并且 Material != select the part Name From inserted)
则添加一条新记录。
触发器代码如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Trigger [dbo].[Application Log Sheet]
ON [dbo].[Parish magazine]
FOR INSERT
AS
DECLARE @a INT;
DECLARE @b int;
SELECT @a = COUNT(*)
FROM Bill of materials
IF @a > 0
BEGIN
UPDATE Vedomostithe
SET Kolichestvennogo = the Number of stock + (select Quantity from inserted)
WHERE Material = (select the part Name from inserted)
END
ELSE IF @a >= 0
INSERT INTO Bill of material(Material, Quantity in stock)
SELECT the part Name, Number
FROM the arrival Journal
WHERE [ID] IN (SELECT [ID] FROM inserted)
Table material 账单:
create table Bill of materials
(
ID int primary key,
Material nvarchar(max),
Quantity in stock int
)
Table到达日志:
create table Journal of the parish
(
ID int primary key,
Part name nvarchar(max),
The number of int
)
一方面,您不应该存储可以计算的数据,因为这样做只是给您一个机会存储的计算与其余数据不一致。因此,我通常建议只使用一个显示总数的视图。
另一方面,这对于 MERGE
来说似乎是一项简单的任务。但我们需要记住 inserted
可以包含 多个 行,并且这些行可能用于多个不同的部分。所以,我们想要这样的东西:
ALTER Trigger [dbo].[Application Log Sheet]
ON [dbo].[Parish magazine]
for insert
AS
MERGE INTO [Bill of Materials] t
USING (SELECT PART, SUM(Quantity) as Qty from inserted group by PART) s
ON t.Part = s.Part
WHEN MATCHED THEN UPDATE SET Quantity = t.Quantity + s.Qty
WHEN NOT MATCHED THEN INSERT (Part,Quantity) VALUES (s.Part,s.Qty)
如果上面的某些名称不正确,我们深表歉意,但希望您能看到如何调整它以满足您的要求(您的问题似乎在各种 table/column 名称之间来回切换,因此似乎有大约有四个不同的 table 名字,而你在开始提问时说有两个)。
提前为我的英语道歉,这是问题所在:因为我无法考虑触发器的逻辑,底线是有 2 个 table:
- material 列表
- 到达日记
将记录添加到教区杂志中的 table 时,应运行触发器检查 table 是否为空添加新条目(Material,库存数量), 如果 table 有记录则在 Material = (select the part Name From inserted)
的条件下更新它们,但如果 table 有记录并且 Material != select the part Name From inserted)
则添加一条新记录。
触发器代码如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Trigger [dbo].[Application Log Sheet]
ON [dbo].[Parish magazine]
FOR INSERT
AS
DECLARE @a INT;
DECLARE @b int;
SELECT @a = COUNT(*)
FROM Bill of materials
IF @a > 0
BEGIN
UPDATE Vedomostithe
SET Kolichestvennogo = the Number of stock + (select Quantity from inserted)
WHERE Material = (select the part Name from inserted)
END
ELSE IF @a >= 0
INSERT INTO Bill of material(Material, Quantity in stock)
SELECT the part Name, Number
FROM the arrival Journal
WHERE [ID] IN (SELECT [ID] FROM inserted)
Table material 账单:
create table Bill of materials
(
ID int primary key,
Material nvarchar(max),
Quantity in stock int
)
Table到达日志:
create table Journal of the parish
(
ID int primary key,
Part name nvarchar(max),
The number of int
)
一方面,您不应该存储可以计算的数据,因为这样做只是给您一个机会存储的计算与其余数据不一致。因此,我通常建议只使用一个显示总数的视图。
另一方面,这对于 MERGE
来说似乎是一项简单的任务。但我们需要记住 inserted
可以包含 多个 行,并且这些行可能用于多个不同的部分。所以,我们想要这样的东西:
ALTER Trigger [dbo].[Application Log Sheet]
ON [dbo].[Parish magazine]
for insert
AS
MERGE INTO [Bill of Materials] t
USING (SELECT PART, SUM(Quantity) as Qty from inserted group by PART) s
ON t.Part = s.Part
WHEN MATCHED THEN UPDATE SET Quantity = t.Quantity + s.Qty
WHEN NOT MATCHED THEN INSERT (Part,Quantity) VALUES (s.Part,s.Qty)
如果上面的某些名称不正确,我们深表歉意,但希望您能看到如何调整它以满足您的要求(您的问题似乎在各种 table/column 名称之间来回切换,因此似乎有大约有四个不同的 table 名字,而你在开始提问时说有两个)。