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];
很抱歉问这个问题,但我是 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];