2013-03-22 21 views
23

これが可能かどうかは疑問でした。 (大規模な単純化された)私は今、別のテーブルには、このクエリの結果をINSERTしたいSQL Server - INSERTステートメントでWITH句を使用する

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

:私はそうのようなSELECTクエリにいくつかの集約されたデータを適用するためにWITH句を使用して既存のクエリを持っています。

私は次のことを試してみました:

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

を私はエラーを取得:

Incorrect syntax near ';'.

だから私は、セミコロンなしで試してみましたが、エラーを持っている:

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.

です異なる構文で可能なことをしようとしていますか?

+0

セミコロンはステートメントの**終了**にあります。それを正面に置くことは悪い習慣であり、セミコロンですべてのステートメントを適切に終了することに慣れるべきです。 –

+0

[INSERT]ステートメントの[documentation](http://msdn.microsoft.com/en-us/library/ms174335(v = sql.110).aspx)を確認しましたか?これは、CTEが「INSERT」の前に来ていることを示し、CTEを使用する例も含まれています。 – Pondlife

答えて

44

の直後にINSERT INTOを配置する必要があります。だから、コードは次のようになります。

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

CTEを使用せずにSQL Fiddle with Demo

0

別の方法を参照してください

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

アウターセレクトが動作するのはなぜですか? –

+0

@KSTech良い質問です。私は、OPが問題をシンプルにしていると思っていました。 –

0

セミコロンは文を終了するために使用され、サブクエリでそれを包むことです。したがって、; WITHを使用すると、前のステートメントを終了します。しかし、それがここでエラーを起こす理由ではありません。ここで問題となるのは、VALUESまたはSELECT構文を探しているINSERT INTOステートメントです。

INSERT INTO文は、VALUESを明示的に指定するか、SELECT文を使用して結果セットを指定することで、2通りの方法で使用できます。

関連する問題