2016-09-19 7 views
0

Ich habe eine WITH-Anweisung, die die Daten sammelt, die ich möchte. Was ich tun möchte, ist eine SELECT aus verschiedenen Teilen meiner WITH und INSERT, die in eine Zieltabelle führen können.Konnte keine Tabelle nach einer WITH-Anweisung löschen

ist hier eine vereinfachte Version meiner langen Abfrage:

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; 

Aber SQL Server hat eine IF Anweisung direkt nach einer WITH nicht zulassen. Ich möchte die IF nicht vor meiner WITH verschieben, weil dann wahrscheinlich meine Zieltabelle für eine lange Zeit leer sein wird.

Einfache Version meiner Frage:

Wie kann ich ein SELECT aus einer WITH Anweisung in einer anderen Tabelle schreiben?

+1

Warum nicht einfach Ihre DestinationTable abschneiden, anstatt sie zu löschen und neu zu erstellen? Wäre viel einfacher und weniger ressourcenintensiv. –

+0

Es klingt, als ob Sie versuchen, "neuere" zwischengespeicherte Ergebnisse aus der langen Abfrage für die Verwendung an anderer Stelle beizubehalten. Sie könnten eine Spalte zu "DestinationTable" hinzufügen, um eine Seriennummer aufzuzeichnen, die Sie jedes Mal erhöhen, wenn Sie Ihre "lange Abfrage" ausführen. Danach löschen Sie alle Zeilen mit einer niedrigeren Seriennummer. Code, der die Daten verwendet, sollte immer Zugriff auf einen vollständigen Satz haben, der durch eine gemeinsame Seriennummer identifiziert wird. (Berücksichtigen Sie Ihre Transaktionen wie für Ihre Anwendung erforderlich.) – HABO

Antwort

2

Da es obligatorisch ist, mit Anweisungsergebnis zu verwenden, folgen Sie mit mit Anweisung. Jede andere Aussage außer mit Ergebnis nicht erlaubt.

Sie können Ihre Drop Aussage über die mit Anweisung

+0

Also sollte ich die Ergebnisse nur in temporäre Tabellen schreiben? – Disasterkid

+0

schreibe drop oben mit –

+0

Ich möchte nicht die IF vor meinem WITH bewegen, denn dann wird es wahrscheinlich sein, dass meine Zieltabelle für eine lange Zeit leer ist. – Disasterkid

2

einfach umstrukturieren es so schreiben:

--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; 

Der Umfang der CTE bedeutet es in der Erklärung unmittelbar nach der Erklärung verwendet werden muss.

Andernfalls benötigen Sie einen anderen Bereitstellungsbereich, um die Last zu verarbeiten, bevor Sie die Zieltabelle ersetzen.

+0

Aber würde dies die 'DestinationTable' nicht für die Zeit verfügbar lassen, während' WITH' läuft? – Disasterkid

+0

Nicht nur leer, es würde nicht existieren. Sie könnten es zuerst erstellen, anstatt INTO zu verwenden. –

+0

Ja, mit "nicht verfügbar" meine ich nicht existierend. Also meinst du, es wäre besser, wenn ich anstelle von 'WITH' temporäre Tabellen für jeden erzeuge und sie dann am Ende entferne? Auf diese Weise kann ich 'IF OBJECT_ID' problemlos verwenden. – Disasterkid

Verwandte Themen