2010-07-22 7 views
119

J'ai un CTE très complexe et je voudrais insérer le résultat dans une table physique.Combinaison INSERT INTO et WITH/CTE

Est-ce que ce qui suit est valide? Je pense à utiliser une fonction pour créer ce CTE qui me permettra de réutiliser. Des pensées?

Répondre

203

Vous devez d'abord mettre le CTE, puis combiner INSERT INTO avec votre instruction select. En outre, le « AS » mot-clé suivant le nom du CTE n'est pas en option:

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

S'il vous plaît noter que le code suppose que le CTE retourne exactement quatre champs et que ces champs sont trouvés en ordre et le type avec celles spécifiées dans l'instruction INSERT. Si ce n'est pas le cas, remplacez simplement le "SELECT *" par une sélection spécifique des champs dont vous avez besoin. En ce qui concerne votre question sur l'utilisation d'une fonction, je dirais "ça dépend". Si vous placez les données dans un tableau uniquement pour des raisons de performances et que la vitesse est acceptable lors de l'utilisation d'une fonction, je considérerais que function est une option. D'autre part, si vous avez besoin d'utiliser le résultat du CTE dans plusieurs requêtes différentes, et que la vitesse est déjà un problème, je choisirais une table (soit regular, soit temp).

WITH common_table_expression (Transact-SQL)

14

Yep:

WITH tab (
    bla bla 
) 

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

SELECT * FROM tab 

Notez que ceci est pour SQL Server, qui prend en charge plusieurs CTEs:

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

Teradata permet à un seul CTE et la syntaxe est votre exemple.

12

La clause WITH for Common Table Expressions aller en haut.

Le fait d'emballer chaque insertion dans un CTE a l'avantage de séparer visuellement la logique de requête du mappage de colonne.

localisé l'erreur:

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_ 

Même erreur:

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

Quelques lignes de texte standard, il est extrêmement facile de vérifier le code insère le bon nombre de colonnes dans la bon ordre, même avec un très grand nombre de colonnes. Votre futur moi vous remerciera plus tard.

+2

C'est génial! Tout à coup, je ne déteste pas autant les déclarations INSERT ... – NReilingh

Questions connexes