A ';' 나는 항상 메모리 터미네이터이지만 Go 문은 배치 터미네이터이다.
당신은 그런 시저, 뷰, 기능을 만들거나 다른 물체는 같은 무리를 할 수있는 DDL 생성을 그래서 경우 :
는 가
가 시저를 만들 GO ....로 PROC ㅋ 만들기 blah2 as ... GO
그런 다음 멋진 작성 스크립트를 하나만 가질 수 있습니다. GO가 없다면 "Create (thing)는 생성의 첫 번째 문장이어야합니다 ...."라고 말하면서 깨질 것입니다. 이것은 SQL이 사용자가 두 작업 모두에 대해 단일 작업을 수행하고 있다고 생각한 것을 의미합니다. 'GO'는 "NEW SCOPE, NEW OBJECT"라고 말합니다. 그래서 주위에 도착합니다. pubs 및 Northwind (이전 MS 테스트 데이터베이스)에 대한 생성 스크립트를 보면 단일 '* .sql'파일에 대해 배치 터미네이터를 사용하고 있다고 생각합니다. 그것은 하나의 파일에서 많은 수의 생성을 가능하게합니다.
A; 성명서까지만 메모리를 종료합니다. 대부분 시간을 생략해도 괜찮을 것이지만 SQL 전문가가 알 수있는 큰 장소는 CTE입니다.
예 CTE는 'with'로 시작하므로 즉시 소리 치지만 'with'로 힌트를 사용할 수도 있으므로 두 거래를 구분해야합니다. 그러면 ' ; '.
EG :
Select * from table -- standard SQL no biggie
또는
Select * from table
Select * from table2 -- these are fine stacked and will run
하지만 ...그것의 맥락 '과'새로운 문으로 변경 한 것을 알고하지 않았기 때문에
Select * from table
with a as (select * from table2) select * from a
즉시 중단됩니다. 당신이 좋아해야 세심한되는 경우 적절한 SQL은 :
Set NoCount ON; -- No thank you engine I don't need to see counts
Set Transaction Level Isolation Level Read Uncommitted; -- Set me to dirty reads as default
Select
*
from table
;
Select
*
from table2
;
SQL의 엔진이 같은 참조 :
설정 읽지 않음 ON을 - 아니 당신에게 엔진을 감사 내가 수를 볼 필요가 없습니다 \ NSET 트랜잭션 레벨 격리 수준 읽기 미완료 읽기 \ n-- 기본적으로 더티 읽기로 설정 \ n \ n 표 \ n * \ n 표 \ n에서 선택 \ n \ n 표 \ 2 \ n 표 \ 2 선택 \ n;
그래서 공백이 어디에서 끝나는 지 사람에게 약간의 도움이 필요합니다. 그렇지 않으면 그것은 사람이 아니며 한 진술이 중단 된 곳과 다른 진술이 시작된 곳을 알지 못합니다.
다른 사람을 위해 작성하고 잘 정의 된 지침에 따라 작성한 것이라면 언제나 ';' 터미네이터를 사용하여 공식 종료 시퀀스를 만듭니다.
갈 일괄 종료하지만, 당신이 좋아하는 데이터베이스를 전환하는 것이 유용하게 그것으로 상황, 변경할 수 있습니다
사용 Database1을 TableOnDatabase1에서
선택 *를 GO;
사용 DATABASE2는 는
를 GO TableOnDatabase2에서
선택 *; 또한
내가 한 줄을 한 공간을 절약하기 위해하지만 정말 당신은 별도의 행에 기본 SQL 구문을 수행해야하며, 또한 하위 구문 같은 : 일반적인 실제 예를 들어
Select
ColumnA
, ColumnB
, count(ColumnC) as cnt
From table
Where thing happens
Group by
ColumnA
, ColumnB
Having Count(ColumnC) > 1
Order by ColumnA
편집 :
set nocount on;
declare @Table table (ints int);
declare @CursorInt int = 1;
while @CursorInt <= 100
begin
insert into @Table values (@CursorInt)
set @CursorInt += 1
End
-- wait a second engine you did not tell me what happened in the 'Messages' section?!
-- aw come on I want to see each transaction!
Set nocount off;
while @CursorInt <= 200
begin
insert into @Table values (@CursorInt)
set @CursorInt += 1
End
-- okay that is annoying I did not have to see 100: "(1 row(s) affected)"
프로 시저 범위에서 원하는만큼 메모리 터미네이터를 사용하여 'nocount'를 켜거나 끌 수 있습니다. 나는 삽입물을보고 내 procs에있는 다른 것들을 무시하기를 원할 때마다 항상 그렇게한다. 그리고 일부를 전달하기를 원한다면 출력 변수를 설정하거나 반환을위한 최종 행 개수를 선택하십시오.
당신의 질문은 실제로'SET NOCOUNT ON'과 아무 관련이 없습니다 : 당신은 실제로 언제 세미콜론을 사용해야하는지 그리고'GO'를 사용할시기를 묻습니다. 두 질문은 이미 답변되었습니다 : [here] (http://stackoverflow.com/questions/710683/when-should-i-use-semicolons-in-sql-server)와 [here] (http : // stackoverflow. com/questions/2668529/t-sql-go-statement). 물론 여기에도 설명서를 읽을 수 있습니다. [here] (http://msdn.microsoft.com/en-us/library/ms177563.aspx) 및 [here] (http://msdn.microsoft.com/en/ -us/library/ms175972.aspx). – Pondlife