使用存储过程创建表并将其插入

时间:2019-10-23 11:54:09

标签: sql-server tsql stored-procedures ddl create-table

我有一个存储过程,已计划将其作为工作在每晚午夜运行。我希望存储过程在运行时将数据插入表中。存储过程运行时,我必须先创建表还是有办法创建表?我的第二个问题是:然后,我需要一项工作,在每晚晚上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)将数据插入表中。

1 个答案:

答案 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

现在,可以为快速检索建立索引,并且表名始终相同;全面减轻了编码和维护的麻烦