我有一个存储过程,已计划将其作为工作在每晚午夜运行。我希望存储过程在运行时将数据插入表中。存储过程运行时,我必须先创建表还是有办法创建表?我的第二个问题是:然后,我需要一项工作,在每晚晚上11点清除该表,然后存储过程在午夜再次运行。感谢您提供任何帮助。我很感激。
这是我的存储过程:
我已经创建了可以成功运行的存储过程。我已经尝试过使用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
我想对这个存储过程做三件事:1)创建一个表,2)运行存储过程,3)将数据插入表中。
答案 0 :(得分:0)
使用常规选择查询时:
SELECT *
INTO person_only_smith
FROM person
WHERE name = 'smith'
要使它成为表格,请使用INTO:
INSERT INTO person_only_smith
SELECT *
FROM person
WHERE name = 'smith'
仅在表不存在时才可以使用。如果该表存在,请使用:
Select
mpp_id,
mpp_firstname,
mpp_lastname,
... more columns ..
INTO your_table_name
FROM ...
-
在您的情况下,INTO才是最终选择(不是CTE)
WITH
...your ctes
)
SELECT
...
INTO #mytemptable
FROM ...
现在,您说您希望此作业按计划运行,这有点意味着表每次运行时都将使用不同的名称。为简单起见,您可能希望先选择到#temp表中,然后使用动态sql将所有内容插入到实际的非临时表中。这意味着您可以拥有一个庞大而复杂的SQL块,但具有语法高亮显示的优点,从而易于调试,而您的动态sql更小,更简单:
DECLARE @sql VARCHAR(2000) = CONCAT('SELECT * INTO jobtable_', FORMAT(getutcdate(), 'yyyyMMddHHmm'), ' FROM #mytemptable');
EXEC (@sql)
由于您的#mytemptable是在执行动态sql的命令之外创建的,因此动态的可以访问它
DECLARE @jobdate DATETIME = getutcdate();
INSERT INTO job_log (jobdate, list,of,other,columns)
SELECT @jobdate, *
FROM person
WHERE name = 'smith'
请记住,如果您在动态sql内创建一个临时表,则执行动态sql上下文之外的代码将无法使用
最后的笔记;更改表名通常很麻烦,如此处所示,需要使用动态sql才能使它们起作用,在前端应用程序中需要更多动态性才能从中检索数据。而是考虑使用固定的表名称和指定作业日期的列。如果您首先将此变量选择为变量,则每一行的值都相同:
numpy.where
现在,可以为快速检索建立索引,并且表名始终相同;全面减轻了编码和维护的麻烦