2011-12-12 4 views
1

Possible Duplicate:
Incorrect syntax near the keyword 'with'…previous statement must be terminated with a semicolonTSQL은 : cteTABLE가 other_table

에 삽입 함께 내가 계층 적 데이터를 선택하고 테이블에 삽입하려고합니다. 따라서 삽입물에 WITH 문을 사용해야합니다.

이 잘 작동 :

create table test_table 
(
id int 
) 

with t_table 
as 
(select 12345 wert) 
insert into test_table (id) 
select wert from t_table 

을하지만이 "WITH 키워드 근처에 잘못된 구문의"를 생성 오류 :

CREATE PROCEDURE p_insert_test 
AS 
BEGIN 

with t_table 
as 
(select 12345 wert) 
insert into test_table (id) 
select wert from t_table 

END 

나는 T-SQL은 INSERT 전에 WITH 키워드를 좋아하지 않는 것 같아요 예어. 저장 프로 시저에서 이러한 종류의 삽입 작업을 수행하려면 어떻게해야합니까?

감사합니다.

+0

정확한 코드 및 오류로 소식을 수정할 수 있습니까? 코드의 첫 번째 블록에는 오류가 있습니다. 두 개의 명령문으로 실행하거나 일괄 처리간에 GO 명령을 사용해야합니다. 또한 오류없이 절차를 실행할 수있었습니다. @JNK는 WITH가 일괄 처리의 첫 번째 항목이어야하는 반면, 여기에서 볼 수있는 유일한 요구 사항은 create table & ad-hoc with-select를 분할하는 것입니다. – EBarr

+0

@EBarr - 첫 번째 문은 작동하지만 두 번째 문은 작동하지 않습니다. 첫 번째 진술이 효과가 없다고 생각하는 것 같습니다. – JNK

+0

맞습니다. 첫 번째 블록을 잘라내어 붙여 넣으면 구문 오류가 발생합니다 (메시지 102, 수준 15, 상태 1, 줄 7. 잘못된 구문 인 't_table'근처). 테이블 작성 후 WITH 또는 세미콜론 사이에 "GO"가 있어야합니다. – EBarr

답변

5

CTE 선언은 배치의 첫 번째 명령이어야합니다.

는 그냥 WITH 전에 세미콜론을 넣어 당신은 잘해야 다음 WITH 키워드를 사용,

다만이 경우 왜을 명확히 :

;WITH t_Table...

편집 WITH RECOMPILE, WITH (NOLOCK) 등과 같은 쿼리 힌트도 있습니다. 쿼리 엔진은 WITH 키 워드의 의도를 알아야합니다. d이고 CTE을 나타내는 유일한 방법은 CTE 선언이 배치의 시작임을 보장하는 것입니다. 부적절 MyTable에 적용되는 쿼리 힌트로 읽을 수 있습니다 문 종료하지 않고

SELECT Field 
FROM MyTable 
WITH CteName 
As 
(Select 1) 

, CteName :

그렇지 않으면, 당신은 같은 모호한 뭔가를 할 수있다.

+5

+1 : 또는 앞의 명령이';'로 끝나야합니다. 대부분의 경우 선택 사항이지만 CTE를 사용하는 경우 이전 명령 '종료'를 종료해야합니다. – MatBailie

관련 문제