2013-03-22 16 views
23

Mi chiedevo se fosse possibile. Ho una query esistente che utilizza la clausola WITH di applicare alcuni dati aggregati a una query SELECT in questo modo: (massicciamente semplificato)SQL Server: utilizzo della clausola WITH in un'istruzione INSERT

;WITH alias (y,z) 
AS 
(
    SELECT y,z FROM tableb 
) 
SELECT y, z FROM alias 

Ora voglio INSERT i risultati di questa query in un'altra tabella.

Ho provato quanto segue:

INSERT INTO tablea(a,b) 
;WITH alias (y,z) 
AS 
(
    SELECT y,z FROM tableb 
) 
SELECT y, z FROM alias 

ma ottengo l'errore:

Incorrect syntax near ';'.

così ho provato, senza il punto e virgola, ma ha ottenuto l'errore:

Incorrect syntax near the keyword 'WITH'.

Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.

Is cosa sto cercando di fare con diverse sintassi diverse?

+0

Il punto e virgola va alla fine ** di una dichiarazione. Metterlo in primo piano è una cattiva abitudine e dovresti abituarti a terminare correttamente ogni affermazione con un punto e virgola. –

+0

Hai controllato la [documentazione] (http://msdn.microsoft.com/en-us/library/ms174335 (v = sql.110) .aspx) per l'istruzione 'INSERT'? Mostra che il CTE precede 'INSERT' e include un esempio di utilizzo di CTE. – Pondlife

risposta

44

È necessario posizionare INSERT INTO subito dopo lo CTE. Così il codice sarà:

;WITH alias (y,z) 
AS 
(
    SELECT y,z FROM tableb 
) 
INSERT INTO tablea(a,b) 
SELECT y, z 
FROM alias 

Vedi SQL Fiddle with Demo

0

Un altro modo senza utilizzare un CTE è avvolgendolo in una sottoquery,

INSERT INTO tablea(a,b) 
SELECT y, z 
FROM 
(
    SELECT y,z FROM tableb 
) alias 
+0

perché selezionare esterno quando la selezione singola può funzionare? –

+0

@KSTech buona domanda. Stavo pensando che l'OP stava solo simulando il problema. –

0

Punto e virgola viene usato per terminare la dichiarazione. Quindi, quando lo usi, CON, termina la dichiarazione precedente. Tuttavia, non è questo il motivo per cui stai ricevendo l'errore qui. Il problema qui è con la tua istruzione INSERT INTO, che sta cercando la sintassi VALUES o SELECT.

L'istruzione INSERT INTO può essere utilizzata in 2 modi: fornendo VALORI in modo esplicito o fornendo un set di risultati utilizzando l'istruzione SELECT.

Problemi correlati