204 votes

Combinant INSÉRER DANS et AVEC/CCE

J'ai une question très complexe CTE et je voudrais insérer le résultat dans la table physique. Est-ce possible:

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

WITH tab (
  bla bla
)

SELECT * FROM tab

Je pense à l'aide d'une fonction pour créer cette CTE des trucs et de les réutiliser dans d'ici? Toute pensée?

Merci

350voto

Valentino Vranken Points 2002

Vous avez besoin de mettre la CTE d'abord et puis de combiner les INSÉRER DANS votre instruction select. Aussi, le "COMME" mot-clé à la suite de la CTE du nom n'est pas une option:

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

Veuillez noter que le code suppose que le CCE sera de retour exactement quatre champs et que ces champs sont les critères dans l'ordre et le type avec celles qui sont spécifiées dans l'instruction INSERT. Si ce n'est pas le cas, il suffit de remplacer le "SELECT *" avec un spécifique, sélectionnez les champs que vous avez besoin.

Quant à votre question sur l'utilisation d'une fonction, je dirais que "ça dépend". Si vous de mettre les données dans une table juste à cause de raisons de performances, et la vitesse est acceptable lors de son utilisation au travers d'une fonction, alors je voudrais examiner la fonction d'être une option. D'autre part, si vous avez besoin d'utiliser le résultat de la CTE dans plusieurs requêtes différentes, et que la vitesse est déjà un problème, j'irais pour un tableau (que ce soit régulière ou temp).

AVEC common_table_expression (Transact-SQL)

22voto

Cade Roux Points 53870

Yep:

WITH tab (
  bla bla
)

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

SELECT * FROM tab

Notez que c'est pour SQL Server qui prend en charge de multiples expressions de table communes:

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 comme votre exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X