2013-03-22 10 views
23

Zastanawiałem się, czy to było możliwe. Mam istniejącego zapytania, który korzysta z klauzuli WITH zastosować pewne dane zagregowane do SELECT kwerendy tak: (znacznie uproszczony)SQL Server - używając klauzuli WITH w instrukcji INSERT

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

Chcę teraz INSERT wyniki tej kwerendy do innej tabeli.

Próbowałem następujące:

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

ale pojawia się błąd:

Incorrect syntax near ';'.

Więc próbowałem bez średnikiem ale mam błąd:

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.

Czy co próbuję zrobić z inną, nieco inną składnią?

+0

Średnik przechodzi na ** koniec ** wyciągu. Umieszczenie go z przodu jest złym nawykiem i powinieneś przyzwyczaić się do właściwego kończenia każdego zdania średnikiem. –

+0

Czy sprawdziłeś [dokumentacja] (http://msdn.microsoft.com/en-us/library/ms174335 (v = sql.110) .aspx) dla instrukcji 'INSERT'? Pokazuje to, że CTE występuje przed 'INSERT' i zawiera przykład użycia CTE. – Pondlife

Odpowiedz

44

Będziesz musiał umieścić INSERT INTO zaraz po CTE. Więc kod będzie:

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

Zobacz SQL Fiddle with Demo

0

inny sposób bez użycia CTE jest przez otoczenie go podzapytania,

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

Dlaczego zewnętrzne wybrać, gdy można wybrać opcję pojedynczego wyboru? –

+0

@KSTech dobre pytanie. Myślałem, że PO po prostu symuluje problem. –

0

średnik jest używany do zakończenia oświadczenie. Tak więc, gdy używasz, Z, kończy poprzednie zdanie. Jednak nie dlatego otrzymujesz błąd tutaj. Problemem jest tutaj instrukcja INSERT INTO, która szuka składni VALUES lub SELECT.

Instrukcja INSERT INTO może być używana na dwa sposoby - poprzez podanie WARTOŚCI jawnie lub poprzez dostarczenie zestawu wyników za pomocą instrukcji SELECT.

Powiązane problemy