我有一个存储过程,它通过一系列cte构建一个结果集,然后该结果集通过管道传输到一个临时表中。
则TRUNCATE
为现有表,INSERT
为临时表的结果集。
我通常只在查询端,而不是存储过程。只是想知道这是否是一个合理的方式来删除&重建表
IF OBJECT_ID('tempdb..#factTSPOrderGoals') IS NOT NULL
DROP TABLE #factTSPOrderGoals;
....
<Bunch of CTEs>
...
SELECT *
INTO #factTSPOrderGoals
FROM CTE_Final
BEGIN TRANSACTION
TRUNCATE TABLE dbo.factTSPOrderGoals
INSERT INTO dbo.factTSPOrderGoals
SELECT *
FROM #factTSPOrderGoals
COMMIT TRANSACTION;
任何SQL命令清除所有cte -因此写入临时表的中间步骤。感觉既干净又干净;有点奇怪,我很好奇这到底有多"合理"。
更好的主意是@SeanLange -只是TRUNCATE第一个
BEGIN TRANSACTION
TRUNCATE TABLE dbo.factTSPOrderGoals;
...
<Bunch of CTEs>
....
INSERT INTO dbo.factTSPOrderGoals SELECT * FROM CTE_Final
COMMIT TRANSACTION;
因此不需要临时表。