Combinazione di INSERT INTO e WITH / CTE

Ho un CTE molto complesso e vorrei inserire il risultato in una tabella fisica.

È il seguente valido?

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

Sto pensando di usare una funzione per creare questo CTE che mi permetterà di riutilizzare. qualche idea?

È necessario innanzitutto inserire il CTE e quindi combinare INSERT INTO con l’istruzione select. Inoltre, la parola chiave “AS” che segue il nome della CTE non è facoltativa:

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

Si noti che il codice presuppone che il CTE restituirà esattamente quattro campi e che quei campi corrispondano in ordine e tipo con quelli specificati nell’istruzione INSERT. In caso contrario, basta sostituire “SELECT *” con una selezione specifica dei campi richiesti.

Per quanto riguarda la tua domanda sull’uso di una funzione, direi “dipende”. Se stai mettendo i dati in una tabella solo per motivi di prestazioni, e la velocità è accettabile quando la usi attraverso una funzione, allora considererei la funzione un’opzione. D’altra parte, se è necessario utilizzare il risultato del CTE in diverse query diverse, e la velocità è già un problema, vorrei andare a un tavolo (normale o temp).

WITH common_table_expression (Transact-SQL)

Sì:

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

Si noti che questo è per SQL Server, che supporta più CTE:

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

Teradata consente solo un CTE e la syntax è come esempio.

La clausola WITH per Common Table Expressions è in cima.

Il wrapping di ogni inserto in una CTE ha il vantaggio di separare visivamente la logica della query dalla mapping della colonna.

Trova l’errore:

 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_ 

Stesso errore:

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

Alcune righe di codice d’aria rendono estremamente semplice verificare che il codice inserisca il giusto numero di colonne nell’ordine corretto, anche con un numero molto elevato di colonne. Il tuo futuro te lo ringrazierò più tardi.