2013-03-15 2 views
1

NOCOUNT 문 사용 및 의미에 관한 사소한 질문입니다. 나는 그것이 두 가지 다른 방법을 사용하는 것을 보았고 실제로 필요한 것이 무엇인지를 알고 싶습니다.SQL의 의미 NOCOUNT

SET NOCOUNT ON; 
GO 

을하고 난 뒤에 세미콜론없이 본 적이 :

SET NOCOUNT ON 
GO 

내가 '

나는 후행 세미콜론 (;)으로 MSDN에 등록 및처럼 문을 GO 보았다

SET NOCOUNT ON 

내가 실현 GO 문없이 본 적이 GO 단순히 시그나 그 배치가 끝났지 만 NOCOUNT을 적용하려면이 호출을해야합니까?

세미콜론의 요점은 무엇입니까?

+1

당신의 질문은 실제로'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

답변

0

세미콜론은 현재 SQL 문을 끝냅니다.

내가 아는 한 SET NOCOUNT ON 후에는 필요하지 않습니다.

NOCOUNT를 적용하려면 '실행'할 필요가 없습니다. 확실하지는 않습니다.

+3

'SET NOCOUNT ON'후에 필요한지 여부는 다음에 따라 다릅니다. 예 : SET NOCOUNT ON; T (C) 그대로 (SELECT 1) SELECT * FROM T;'. 명령문 종결 자로 세미콜론을 사용하지 않는 것은 더 이상 사용되지 않습니다. –

0

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에있는 다른 것들을 무시하기를 원할 때마다 항상 그렇게한다. 그리고 일부를 전달하기를 원한다면 출력 변수를 설정하거나 반환을위한 최종 행 개수를 선택하십시오.