Создать таблицу и вставить в нее с помощью хранимой процедуры - PullRequest
0 голосов
/ 23 октября 2019

У меня есть хранимая процедура, которую я запланировал как задание, которое будет выполняться ночью в полночь. Я хочу, чтобы хранимая процедура для вставки данных в таблицу при запуске. Нужно ли сначала создавать таблицу или есть способ создать таблицу при запуске хранимой процедуры? Мой второй вопрос: мне нужно задание очищать одну и ту же таблицу каждую ночь в 23:00, прежде чем хранимая процедура снова запустится в полночь. Спасибо за любую помощь, которую вы можете предоставить. Я ценю это.

Вот моя хранимая процедура:

Я уже создал хранимую процедуру, она успешно выполняется. Я пытался использовать CREATE и INSERT INTO, но ни одна из них не работает.

USE [TMWSUITE]
GO
/****** Object:  StoredProcedure [dbo].[Wynne_DriverSnapshot] Script Date: 10/22/2019 6:35:18 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[Wynne_DriverSnapshot] as

WITH cte (mpp_id, mpp_firstname, mpp_lastname, mpp_status, mpp_fleet, mpp_terminal) as 
(
  Select mpp_id, mpp_firstname, mpp_lastname, mpp_status, mpp_fleet, mpp_terminal from manpowerprofile where mpp_terminationdt >= GETDATE()),
  cte2 (lgh_number, lgh_startdate, lgh_enddate, lgh_outstatus, rn, lgh_driver1, lgh_class, lgh_class2) as 
(
  Select lgh_number, lgh_startdate, lgh_enddate, lgh_outstatus, ROW_NUMBER() OVER (PARTITION by lgh_driver1 order by lgh_number desc) as 
  rn, lgh_driver1, lgh_class1, lgh_class2 From legheader
) 
  Select mpp_id, mpp_firstname, mpp_lastname, mpp_status, mpp_fleet, mpp_terminal, lgh_number, lgh_startdate, lgh_enddate, lgh_outstatus, lgh_driver1, lgh_class, lgh_class2 from cte 
  left join cte2 on mpp_id = lgh_driver1 where rn = '1' and mpp_id NOT IN ('UNKNOWN','TESDR','TESDR2') order by mpp_id

Я хотел бы сделать 3 вещи с этой хранимой процедурой: 1) создать таблицу, 2) запустить хранимую процедуру и 3) вставьте данные в таблицу.

1 Ответ

0 голосов
/ 23 октября 2019

Если у вас есть обычный запрос выбора:

SELECT *
FROM person
WHERE name = 'smith'

Чтобы создать таблицу, которую вы используете INTO:

SELECT *
INTO person_only_smith
FROM person
WHERE name = 'smith'

Это может работать, только если таблица не существует,Если таблица существует, используйте:

INSERT INTO person_only_smith
SELECT *
FROM person
WHERE name = 'smith'

-

В вашем случае INTO делает окончательный выбор (не в CTE)

Select 
mpp_id,
mpp_firstname,
mpp_lastname, 
... more columns ..
INTO your_table_name
FROM ...

Теперь,вы говорите, что хотите, чтобы это задание выполнялось по расписанию, что, как бы, означает, что таблица будет иметь другое имя при каждом запуске. Для простоты вы можете сначала выбрать таблицу #temp, а затем использовать динамический sql для вставки всего в фактическую невременную таблицу. Это означает, что у вас может быть большой и сложный блок SQL, который имеет преимущество подсветки синтаксиса для простой отладки, а ваш динамический sql намного меньше и проще:

WITH
...your ctes
)
SELECT
...
INTO #mytemptable
FROM ...

Поскольку ваш #mytemptable созданвне команды, которая выполняет динамический sql, она доступна для динамического

DECLARE @sql VARCHAR(2000) = CONCAT('SELECT * INTO jobtable_', FORMAT(getutcdate(), 'yyyyMMddHHmm'), ' FROM #mytemptable');
EXEC (@sql)

Помните, что если вы создаете временную таблицу внутри динамического sql, она не доступна для кода вне контекставыполнения динамического sql


Заключительная нота;переменные имена таблиц часто доставляют неудобства, как видно из того, что необходимо перейти к динамическому sql, чтобы заставить их работать, и еще больше динамизма в приложении переднего плана для извлечения данных из них. Вместо этого рассмотрим фиксированное имя таблицы и столбец, в котором указана дата работы. Если вы сначала выберете это значение в переменной, оно будет иметь одинаковое значение для каждой строки:

DECLARE @jobdate DATETIME = getutcdate();

INSERT INTO job_log (jobdate, list,of,other,columns)
SELECT @jobdate, *
FROM person
WHERE name = 'smith'

Теперь это может быть проиндексировано для быстрого поиска, и имя таблицы всегда одинаково;повсюду меньше головной боли при кодировании и обслуживании

...