CTE가 세미콜론으로 시작해야하는 이유는 무엇입니까?


14

Aaron Bertrand가 숫자 표 대신 CTE를 사용하도록 제안하는 StackOverflow 의 게시물을 보았습니다 . 이는 당면한 작업을 수행하는 우아한 방법입니다. 제 질문은 왜 CTE의 첫 번째 줄이 세미콜론으로 시작합니까?

;WITH n AS (SELECT TOP (10000) n FROM 
  (SELECT n = ROW_NUMBER() OVER
    (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
  ) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!

WITH 문이 이전 SELECT또는 다른 것으로 구문 분석되지 않도록하기위한 것입니까? WITH 이전에 세미콜론을 사용하는 것과 관련하여 SQL Server 2005 BOL에서 아무것도 볼 수 없습니다.


답변:


26

WITH키워드가 과부하 되었기 때문에 이전 명령에는 세미콜론을 종료해야 하기 때문에 여기 또는 StackOverflow에 게시 할 때 항상 수행합니다 . CTE를 사용하는 코드 샘플을 붙여 넣으면 필연적으로 일부 사용자가 기존 코드에 붙여 넣을 것이며 이전 명령문에는 세미콜론이 없습니다. 그래서 코드가 깨지고 다음과 같은 불만이 발생합니다.

코드가 깨졌습니다! 이 오류 메시지가 나타납니다 :

Incorrect syntax near 'WITH'...

나는 사람들이 세미콜론으로 항상 자신의 진술을 끝내는 것에 대해 더 좋아지고 있다고 생각하고 싶지만, 나는 소음을 선취하고 항상 포함하고 싶습니다. 어떤 사람들은 그것을 좋아하지 않지만 <shrug />. 유효한 문장 전후에 세미콜론을 원하는만큼 포함시킬 수 있습니다. 유효합니다 :

;;;;SELECT 1;;;;;;;;;;;;SELECT 2;;;;;;;;SELECT 3;;;;;

따라서 정의에 따라 요구되는 문장 앞에 여분의 세미콜론이 있으면 아무런 해가 없습니다. 예쁘지 않더라도 그렇게하는 것이 더 안전합니다.

포인트를 얻으려면 이상하게 표현해야하지만 SQL Server 2008부터는 "세미콜론으로 유효한 명령문을 끝내지 않습니다"는 실제로 사용되지 않습니다. 블로그 게시물에서 설명하는 것처럼 위의 링크는 오류를 우회 할 필요는 없으며 유효한 곳이면 어디에서나 사용해야합니다. 여기서 볼 수 있습니다 :

http://msdn.microsoft.com/en-us/library/ms143729.aspx

(마지막 페이지에서 "세미콜론"검색)

물론 예외가 없다면 SQL Server가 아닐 것입니다. 이 시도:

BEGIN TRY;
  SELECT 1/1;
END TRY;
BEGIN CATCH;
  SELECT 1/1;
END CATCH;

그것은 규칙에 대한 유일한 예외는 아니지만 내가 가장 직관적이지 않은 예외입니다.


1
2012 년에도 나는 오직 때문에 후 세미콜론의, 같은 오류 메시지가 END TRY: i.stack.imgur.com/rc6dw.png - 나는 모든 작품을 그 세미콜론을 제거합니다.
Aaron Bertrand

세미콜론 BEGIN CATCH은로 도입 된 단일 복합 문장의 일부이기 때문에 세미콜론을 넣을 수 없다고 생각합니다 BEGIN TRY. IF명령문 앞에 세미콜론을 넣는 것과 같습니다 ELSE.
Andriy M

@AndriyM 나는 규칙에 대해 훨씬 더 자세한 대화를 좋아했습니다. 나는 이유를 이해하지 못하기 때문에 그것을 겪는 모든 사람에게 놀랍기 때문에 그것을 언급했습니다. :-)
Aaron Bertrand

10

이는 WITHT-SQL에서 다양한 용도로 사용될 수 있으므로 이전 명령문에 포함되지 않도록하기위한 것입니다 .

배치의 첫 번째 진술이라면 필요하다고 생각하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.