web-dev-qa-db-fra.com

Instruction SQL Server WITH

Mon objectif est de sélectionner le résultat d'un CTE et de l'insérer dans une autre table avec un autre CTE dans la même procédure. Comment faire?

Mon erreur est ...

nom d'objet non valide xy.

Ma requête est

WITH ds
(
    Select a, b, c 
    from test1    
),
xy
(
    select d, e, f 
    from test2 
    where (uses conditions from ds)    
)
Select * 
from ds  (the result set of ds, am exporting this to csv)

Insert into AuditTest
(
  Select * from xy
)
7
user28455

Un CTE n'est valable que pour une seule requête, mais il semble que vous pouvez utiliser un CTE dans chaque requête:

WITH ds AS
(
  Select a, b, c from test1    
)
Select * from ds  (the result set of ds, am exporting this to csv)


WITH xy AS
(
 select d,e,f from test2 where (uses conditions from test1)    
)
Insert into AuditTest
(
  Select * from xy
)
13
D Stanley

Vous pouvez réellement effectuer à la fois l'insertion et la sortie des résultats à l'aide de la clause OUTPUT pour renvoyer les lignes insérées.

;WITH ds AS
(
  Select a, b, c from test1 
),
xy AS
(
 select d, e, f from test2 where (uses conditions from ds)
)
Insert into AuditTest
output inserted.d, inserted.e, inserted.f
Select d, e, f from xy

ou un vrai test

CREATE TABLE #Test (a int)

;WITH ds AS
(
  Select 0 as a, 1 as b, 2 as c 
),
xy AS
(
 select a as d, b as e from ds
)
Insert into #Test 
OUTPUT inserted.a
Select e from xy
5
Ceres

Vous pouvez exécuter le INSERT ainsi, vous ne pouvez pas exécuter plusieurs requêtes après votre cte:

;WITH ds AS (  Select a, b, c 
              from test1    
           )
    ,xy AS (  select d,e,f 
              from test2 
              where (uses conditions from test1)    
           )
Insert into AuditTest
Select * 
from xy

Dans ce cas, l'utilisation de tables temporaires peut être bénéfique car vous réexécuterez une requête plusieurs fois dans le cas contraire.

0
Hart CO