2013-03-22 62 views
23

我想知道這是否可能。我有一個使用WITH子句一些彙總數據應用到SELECT查詢像這樣一個現有的查詢:(大型簡體)SQL Server - 在INSERT語句中使用WITH子句

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

我現在想INSERT這個查詢的結果到另一個表。

我曾嘗試以下:

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

分號位於語句的**結尾**處。把它放在前面是一個壞習慣,你應該習慣用分號正確地終止每個語句。 – 2013-03-22 15:40:28

+0

你是否檢查過'INSERT'語句的[documentation](http://msdn.microsoft.com/en-us/library/ms174335(v = sql.110).aspx)?它表明CTE在'INSERT'之前,並且包括使用CTE的一個例子。 – Pondlife 2013-03-22 16:26:24

回答

44

您需要將INSERT INTO放在CTE之後。因此,代碼將是:

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

SQL Fiddle with Demo

0

的另一種方法,而無需使用CTE是在子查詢包裹它,

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

爲什麼外部選擇單選可以工作? – 2013-03-22 15:46:52

+0

@KSTech很好的問題。我以爲OP只是在簡化這個問題。 – 2013-03-22 15:48:39

0

分號用於終止聲明。所以當你使用WITH時,會終止前面的語句。但是,這不是你在這裏遇到錯誤的原因。這裏的問題是你的INSERT INTO語句,它正在尋找VALUES或SELECT語法。

INSERT INTO語句可以以兩種方式使用 - 通過顯式提供VALUES或通過使用SELECT語句提供結果集。