2016-09-19 90 views
0

我有一个WITH语句收集我想要的数据。我想要做的是能够从我的WITHINSERT的不同部分执行SELECT,从而生成目标表。WITH语句后无法删除表格

这里是我长的查询的简化版本:

WITH Active AS (
    --SELECT 1 
), 
Inactive AS (
    --SELECT 2 
), 
Churn AS (
    --SELECT 3 
) 
--Drop destination table if exists 
IF OBJECT_ID('DestinationTable', 'u') IS NOT NULL DROP TABLE DestinationTable; 

SELECT Active.Name, Inactive.Name,Churn.Id 
INTO DestinationTable 
FROM Active a 
JOIN Inactive i ON a.Id = i.Id 
JOIN Churn c ON a.Id = c.Id; 

Sql Server的不直接在WITH后允许IF声明。我不想在我的WITH之前移动IF,因为那样我的目的地表很可能会长时间为空。

简单的版本,我的问题的:

我怎么能写从WITH语句转换成另一个表SELECT

+1

为什么不截断你的DestinationTable而不是删除它并重新创建它?会更简单,资源更少。 –

+0

这听起来像你正试图维护长期查询中“最近”的缓存结果以供其他地方使用。您可以在“DestinationTable”中添加一列以记录每次运行“长查询”时增加的序列号。完成后,删除所有具有较低序列号的行。使用数据的代码应该始终可以访问由一个通用序列号标识的一个完整集。 (请注意您的应用程序需要的交易。) – HABO

回答

2

因为它是强制使用与语句结果跟在一起的声明。 除结果不允许外,其他语句。

你可以声明上面写的你降声明

+0

因此,我应该只将结果写入临时表中? – Disasterkid

+0

用 –

+0

写下上面我不想在我的WITH之前移动IF,因为那样很可能我的目标表很长一段时间是空的。 – Disasterkid

2

就重组这样的:

--Drop destination table if exists 
IF OBJECT_ID('DestinationTable', 'u') IS NOT NULL DROP TABLE DestinationTable 

;WITH Active AS (
    --SELECT 1 
), 
Inactive AS (
    --SELECT 2 
), 
Churn AS (
    --SELECT 3 
) 

SELECT Active.Name, Inactive.Name,Churn.Id 
INTO DestinationTable 
FROM Active a 
JOIN Inactive i ON a.Id = i.Id 
JOIN Churn c ON a.Id = c.Id; 

的CTE的范围意味着它需要在它的声明后的声明中使用。

否则,在替换目标表之前,您需要一些其他临时区域来处理负载。

+0

但是这会不会在'WITH'正在运行时让'DestinationTable'不可用? – Disasterkid

+0

不只是空的,它不会存在。您可以先创建它,而不是使用INTO。 –

+0

是的,通过“不可用”,我的意思是不存在。所以你认为如果不是用'WITH',而是为每个表创建临时表并最终删除它们会更好?这样我可以使用'IF OBJECT_ID'而没有问题。 – Disasterkid