选择“插入/插入SQL Server查询重复项”

时间:2019-02-27 16:39:52

标签: mysql sql-server sql-insert select-into

很抱歉提出这个问题,但是我是SQL的初学者,我的同事在构建一个视图,我需要该视图作为报表的数据源,但是由于该视图基于其他几个视图,因此大约需要45分钟执行查询。这是很长的路要走。因此,我从该视图创建了一个表,初始执行时间是相同的,但是一旦到位,它就会在几秒钟内执行。

在Microsoft SQL Server 2014中,我使用以下查询:

select * 
into [dbo].[MAT_v_demnew_daily_am_all_data]
from [dbo].[v_demnew_daily_am]

这可以正常工作,但是由于视图是每天更新的,因此我还需要每天刷新表。现在,当我执行上述查询时,我得到该表已存在的消息。

这就是为什么我在这种情况下尝试使用“插入”的原因:

insert into [dbo].[MAT_v_demnew_daily_am_all_data]
    select * 
    from [dbo].[v_demnew_daily_am]

这是一个问题,它不仅会插入其他数据,还会插入已经存在的数据,因此最后我有重复的数据。

作为一种解决方法,我现在手动删除[dbo].MAT_v_demnew_daily_am_all_data]表,然后执行select * into查询。

现在,我正在寻找一种更简单的解决方案,可以通过查询删除表,并在同一查询中通过select * into创建一个新表,也可以只从视图中插入新数据到桌子,这样我就不会重复。

此外,是否有可能每天都通过.bat文件和Windows Task Scheduler自动执行此类SQL语句?

我知道所有问题的源头都是视图,我们应该对此加以改进,但是首先要寻求短期解决方案。

非常感谢。

Mathias

1 个答案:

答案 0 :(得分:1)

尝试一下:

IF OBJECT_ID('dbo.MAT_v_demnew_daily_am_all_data', 'U') IS NOT NULL 
DROP TABLE dbo.MAT_v_demnew_daily_am_all_data 
SELECT INTO dbo.MAT_v_demnew_daily_am_all_data FROM dbo.v_demnew_daily_am

该查询每天可重复使用。

您可以创建一个包含此查询的存储过程。

然后,您只需要执行存储过程。


已更新

在创建存储过程之前,请检查是否具有权限。

然后尝试:

create procedure [procedure_name]
as
IF OBJECT_ID('dbo.MAT_v_demnew_daily_am_all_data', 'U') IS NOT NULL 
DROP TABLE dbo.MAT_v_demnew_daily_am_all_data 
SELECT INTO dbo.MAT_v_demnew_daily_am_all_data FROM dbo.v_demnew_daily_am; 

创建后:

EXEC [procedure_name];
相关问题