Выберите Into / Вставить в SQL Server дубликаты запросов - PullRequest
0 голосов
/ 27 февраля 2019

Извините, что задаю этот вопрос, но я новичок в SQL, мой коллега по работе создает представление, которое мне нужно в качестве источника данных для отчета, однако, поскольку это представление основано на нескольких других представлениях, оно занимает около 45 минут.выполнить запрос.Это способ долго.Поэтому я создал таблицу из этого представления, начальное время выполнения остается тем же, но когда оно выполняется на месте, оно выполняется за считанные секунды.

В Microsoft SQL Server 2014 я использовал следующий запрос:

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

Это прекрасно работает, но так как представление обновляется ежедневно, мне также нужно обновлять таблицу каждый день.Когда я сейчас выполняю вышеупомянутый запрос, я получаю сообщение, что таблица уже существует.

Вот почему я попытался использовать '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] и затем выполняю запрос select * into.

Теперь я ищу более простое решение: возможно ли удаление таблицы по запросу и в том же запросе создать новую с помощью select * into или можно только вставить новые данные из представленияк столу, чтобы я не получил дубликаты.

Кроме того, возможно ли, чтобы такой оператор SQL выполнялся автоматически ежедневно, возможно, с помощью планировщика файлов .bat и windows?

Я знаю, что источником всех проблем является View и что мы должны его улучшить, но сначала ищем краткосрочное решение.

Большое спасибо.

Матиас

1 Ответ

0 голосов
/ 27 февраля 2019

Попробуйте:

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