SQL Server如何更改视图,使其在插入到表中时不会产生重复项?
我有一个观点SQL Server如何更改视图,使其在插入到表中时不会产生重复项?,sql,sql-server,view,triggers,duplicates,Sql,Sql Server,View,Triggers,Duplicates,我有一个观点 CREATE VIEW v1 AS SELECT [EmployeeNo.], SUM([HoursTaken]) AS HoursTaken FROM [dbo].[HolidayRequestForm] GROUP BY [EmployeeNo.] 我想把这个视图的输出放到一个表中。 使用 产生 EmployeeID | HoursRequested | ------------+----------------+ 1 | 8
CREATE VIEW v1 AS
SELECT [EmployeeNo.],
SUM([HoursTaken]) AS HoursTaken
FROM [dbo].[HolidayRequestForm]
GROUP BY [EmployeeNo.]
我想把这个视图的输出放到一个表中。
使用
产生
EmployeeID | HoursRequested |
------------+----------------+
1 | 8 |
2 | 16 |
3 | 8 |
我将此视图与触发器一起使用,因此当[dbo].[HolidayRequestForm]更新或插入新行时,它会在我的表[dbo].[Employees]上生成重复的行
如何让它只更新表[dbo].[Employees]
而不是,也不是生产重复品?您正在寻找的
根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,可以通过根据在另一个表中发现的差异插入、更新或删除一个表中的行来同步两个表
无论如何,在每次视图更新时更新孔表似乎不是一个好主意。尝试此查询
MERGE EMPLOYEES E
using v1
ON E.employeeid = v1.employeeno
WHEN matched THEN
UPDATE SET E.hoursrequested = v1.hourstaken
WHEN NOT MATCHED BY TARGET THEN
INSERT (employeeid,
hoursrequested)
VALUES (v1.employeeno,
v1.hourstaken);
进一步信息它在关键字“BY”附近给出了错误语法。您现在可以尝试不同的错误消息207,级别16,状态1,第3行无效列名“employeeid”吗。Msg 207,第16级,状态1,第3行的列名“employeeno”无效。我想我应该使用表名LWEmployees而不是Employees。我想我只是更改了它?尝试在表和视图中使用适当的列名,我已经从上面复制了列名。您的视图根本不会生成重复项,无论对视图本身运行什么查询。问题在于触发器中没有显示的代码。此外,将insert插入到依赖于Employee的表中,即表单表中应该有一个外键指向Employee的想法没有什么意义
MERGE [dbo].[Employees] AS target
USING (SELECT [EmployeeNo.], HoursTaken FROM v1)
AS source ([EmployeeNo.], HoursTaken)
ON (target.EmployeeID = source.[EmployeeNo.])
WHEN MATCHED THEN
UPDATE SET HoursRequested = source.HoursTaken
WHEN NOT MATCHED THEN
INSERT (EmployeeID , HoursRequested)
VALUES (source.[EmployeeNo.], source.HoursTaken)
MERGE EMPLOYEES E
using v1
ON E.employeeid = v1.employeeno
WHEN matched THEN
UPDATE SET E.hoursrequested = v1.hourstaken
WHEN NOT MATCHED BY TARGET THEN
INSERT (employeeid,
hoursrequested)
VALUES (v1.employeeno,
v1.hourstaken);