2010-07-22 3 views
119

Ich habe eine sehr komplexe CTE und ich möchte das Ergebnis in eine physikalische Tabelle einfügen.Kombination INSERT IN und mit/CTE

Ist das Folgende gültig?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID, 
    AccountNo, 
    APartyNo, 
    SourceRowID 
)  
WITH tab (
    -- some query 
)  
SELECT * FROM tab 

Ich denke über die Verwendung einer Funktion zum Erstellen dieses CTE, die mir die Wiederverwendung ermöglicht. Irgendwelche Gedanken?

Antwort

203

Sie müssen zuerst das CTE setzen und dann das INSERT INTO mit Ihrer SELECT-Anweisung kombinieren. Auch die „AS“ Stichwort folgenden Namen des CTE ist nicht optional:

WITH tab AS (
    bla bla 
) 
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID, 
AccountNo, 
APartyNo, 
SourceRowID 
) 
SELECT * FROM tab 

Bitte beachten Sie, dass der Code geht davon aus, dass der CTE genau vier Felder zurück, und dass diese Felder mit dem in Reihenfolge und Typ angegeben passen in die INSERT-Anweisung. Wenn dies nicht der Fall ist, ersetzen Sie einfach die "SELECT *" mit einer bestimmten Auswahl der Felder, die Sie benötigen.

Wie für Ihre Frage zur Verwendung einer Funktion, würde ich sagen "es kommt darauf an". Wenn Sie die Daten nur aus Leistungsgründen in eine Tabelle schreiben und die Geschwindigkeit bei der Verwendung über eine Funktion akzeptabel ist, würde ich die Funktion als Option betrachten. Auf der anderen Seite, wenn Sie das Ergebnis der CTE in mehreren verschiedenen Abfragen verwenden müssen, und Geschwindigkeit ist bereits ein Problem, würde ich für eine Tabelle (entweder reguläre oder temp) gehen.

WITH common_table_expression (Transact-SQL)

14

Yep:

WITH tab (
    bla bla 
) 

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID,              AccountNo, 
APartyNo, 
SourceRowID)  

SELECT * FROM tab 

Beachten Sie, dass dies für SQL Server ist, der mehrere CTEs unterstützt:

WITH x AS(), y AS() INSERT INTO z (a, b, c) SELECT a, b, c FROM y 

Teradata erlaubt nur einen CTE und die Syntax ist als Beispiel.

12

Die WITH Klausel für Expressions Common Table an der Spitze gehen.

Das Einschließen jeder Einfügung in einem CTE hat den Vorteil, die Abfragelogik visuell von der Spaltenzuordnung zu trennen.

Finde den Fehler:

WITH _INSERT_ AS (
    SELECT 
    [BatchID]  = blah 
    ,[APartyNo]  = blahblah 
    ,[SourceRowID] = blahblahblah 
    FROM Table1 AS t1 
) 
INSERT Table2 
     ([BatchID], [SourceRowID], [APartyNo]) 
SELECT [BatchID], [APartyNo], [SourceRowID] 
FROM _INSERT_ 

gleiche Fehler:

INSERT Table2 (
    [BatchID] 
,[SourceRowID] 
,[APartyNo] 
) 
SELECT 
    [BatchID]  = blah 
,[APartyNo]  = blahblah 
,[SourceRowID] = blahblahblah 
FROM Table1 AS t1 

Ein paar Zeilen von Textvorschlag, den Code zu überprüfen, fügt die richtige Anzahl von Spalten in es extrem einfach machen die richtige Reihenfolge, selbst mit einer sehr großen Anzahl von Spalten. Dein zukünftiges Selbst wird dir später danken.

+2

Das ist großartig! Plötzlich hasse ich INSERT-Statements nicht so sehr ... – NReilingh