Select Into/Insert 成 SQL 服务器查询重复

Select Into/Insert Into SQL Server query duplicates

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

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

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

这工作正常,但由于视图每天更新,我还需要每天刷新 table。当我现在执行上述查询时,我收到 table 已经存在的消息。

这就是我在这种情况下尝试使用 'insert' 的原因:

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] table,然后执行 select * into 查询。

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

此外,是否有可能每天自动执行这样的 SQL 语句,也许是通过 .bat 文件和 windows 任务调度程序?

我知道所有问题的根源都是视图,我们应该改进它,但首先要寻找短期解决方案。

非常感谢。

马蒂亚斯

试试这个:

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