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);