SQL Server에서는 언제 GO를 사용해야하며 언제 세미콜론을 사용해야합니까?


100

명령 뒤에 GO 키워드를 사용해야 할 때와 명령 끝에 세미콜론이 필요한지 항상 혼란스러워했습니다. 차이점은 무엇이며 왜 / 언제 사용해야합니까?

SQL Server Management Studio에서 Generate-script를 실행하면 모든 곳에서 GO를 사용하는 것 같지만 세미콜론은 사용하지 않습니다.


답변:


93

GOSSMS 와만 관련이 있습니다. 실제 Transact SQL이 아니며 SSMS GO에 개별 일괄 처리에서 순차적으로 SQL 문을 보내도록 지시 합니다.

;SQL 문 구분 기호이지만, 대부분의 엔진은 문이 깨진 곳 해석 할 수 있습니다.

주된 예외 및 ;가장 자주 사용되는 장소 는 공통 테이블 표현식 문 앞입니다.


5
온 강조 GO하면서 T-SQL 일부가 아닌 ;것입니다
msarchet

2
MERGE문은 세미콜론으로 종료해야합니다.
onedaywhen

15
업데이트 : SQL Server 2012에서 세미콜론을 사용하지 않는 것은 더 이상 사용되지 않으므로 다음 버전에서 필요합니다. 따라서 세미콜론을 사용하는 것이 좋습니다. 마이그레이션의 경우 작업이 덜 필요하기 때문입니다 (그리고 표준이기 때문입니다). 출처 : technet.microsoft.com/en-us/library/ms143729.aspx 또는 SQL Server 2012 관련 책 : shop.oreilly.com/product/0790145321978.do
Paweł Bulwan 2013 년

1
SQL 2014는 다음 버전에 필요한 세미콜론을 계속 나열합니다. 언제 더 이상 사용되지 않을지 궁금합니다. technet.microsoft.com/en-us/library/ms143729.aspx
프랭크

2
+ buli는 ;더 이상 사용되지 않는다고 말하지 않습니다. 사용하지 않는 것은 더 이상 사용되지 않습니다. 즉, 소스에 따라 필수가 될 것입니다.
cjk

78

생성 된 DDL 스크립트에 GO가 너무 많이 표시되는 이유 는 배치 에 대한 다음 규칙 때문입니다 .

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER 및 CREATE VIEW 문은 일괄 처리에서 다른 문과 결합 할 수 없습니다. CREATE 문은 일괄 처리를 시작해야합니다. 해당 일괄 처리에서 뒤 따르는 다른 모든 문은 첫 번째 CREATE 문 정의의 일부로 해석됩니다.

생성 된 DDL의 사용 사례 중 하나는 단일 파일에 여러 개체를 생성하는 것입니다. 이 때문에 DDL 생성기는 배치를 생성 할 수 있어야합니다. 다른 사람들이 말했듯이 GO 문은 배치를 종료합니다.


10
"... 언제 GO ...?"라고 대답 한 유일한 사람입니다. 질문의 일부입니다.
Roimer 2013

GO가 다음을 포함 할 수있는 SQL을 포함하는 객체를 생성하는 문을 종료하는 것 같습니다. 문 종결 자. 다른 DBMS에서 종료 문자열을 설정하는 기능을 보았습니다. 예를 들어 두 개의 파이프 문자 ||로 끝나는 명령문을 지정할 수 있습니다. 그런 다음 CREATE PROCEDURE ...로 끝나는 많은 SQL을 실행할 수 있습니다. ... || 이중 파이프는 CREATE PROCEDURE 문을 끝냅니다. 그래서 내 질문은 이것이 MS GO 성명서와 일치하는지 여부입니다. 둘째, SQLSERVER에서 종료 문자열을 재정의 할 수 있습니까?
youcantryreachingme

@youcantryreachingme 2010 년에 이것이 사실인지 모르겠지만 할 수있는 것 같습니다. SSMS : 배치 분리기를 참조하십시오 . 이것의 한계가 무엇인지 잘 모르겠습니다
Conrad Frix

34

가다

Go는 일괄 구분 기호입니다. 이는 해당 배치의 모든 것이 해당 특정 배치에 로컬임을 의미합니다.

변수, 테이블 변수 등의 선언은 GO명령문을 거치지 않습니다 .

#Temp 테이블은 연결에 로컬이므로 GO 문에 걸쳐 있습니다.

세미콜론

세미콜론은 문 종결 자입니다. 이것은 순전히 특정 명령문이 종료되었음을 식별하는 데 사용됩니다.

대부분의 경우 명령문 구문 자체만으로도 명령문의 끝을 확인할 수 있습니다.

그러나 CTE는 WITH가 첫 번째 문이므로 WITH 앞에 세미콜론이 필요합니다.


4
MERGE문은 세미콜론으로 종료해야합니다.
onedaywhen

11

세미콜론을 사용하여 모든 SQL 문을 종료해야합니다. 이것은 SQL 표준에 정의되어 있습니다.

물론 SQL Server에서는 문 종결자를 생략 할 수있는 경우가 많지만 왜 나쁜 습관에 빠지게 될까요?

다른 사람들이 지적했듯이 CTE (공통 테이블 식) 앞의 문은 세미콜론으로 끝나야합니다. 결과적으로 세미콜론 종결자를 완전히 수용하지 않은 사람들로부터 우리는 다음을 볼 수 있습니다.

;WITH ...

정말 이상해 보입니다. 붙여 넣을 코드의 품질을 알 수없는 온라인 포럼에서 의미가 있다고 생각합니다.

또한 MERGE문은 세미콜론으로 종료해야합니다. 여기에 패턴이 보이십니까? 이들은 SQL 표준을 밀접하게 따르는 TSQL에 대한 몇 가지 새로운 추가 사항입니다. SQL Server 팀이 세미콜론 종결 자 사용을 의무화하는 길을 가고있는 것 같습니다.


2
" 정말 이상해 보인다 "-더 이상 동의 할 수 없었다. 그리고 같은 이상한 질문이 리드의 지속적인 반복
a_horse_with_no_name

SQL Server는 실수를 허용하지 않습니다. 중복 문 종결자를 생략 할 수 있습니다. 대부분의 다른 SQL과 마찬가지로 T-SQL은 순수한 표준 SQL이 아니며, 이는 추상 기본 클래스와 비슷합니다. 실제로 DB 엔진 자체의 방언을 선호하지 않습니다.
ProfK

@ProfK : 댓글에 구두점을 포함 해 주셔서 감사합니다. 특히 문장 종결 자 문자를 쉽게 읽고 이해할 수 있습니다. 비록, 표준 영어 준수하지 않는 하이픈의 사용량 ...
onedaywhen

8

GO는 배치 종료 자이고 세미콜론은 명령문 종료 자입니다.

create proc이 일괄 처리의 첫 번째 문이어야하므로 하나의 스크립트에 여러 개의 create proc 문이 있어야 할 때 GO를 사용합니다. 공통 테이블 표현식을 사용하는 경우 세미콜론으로 종료해야하는 이전 명령문


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