MSDN 등을 읽고 읽었습니다. Ok, 배치의 끝을 알립니다.
배치를 정의하는 것은 무엇입니까? 여러 스크립트를 모두 동시에 실행하기 위해 붙여 넣을 때 왜 가야하는지 알 수 없습니다.
나는 GO를 이해하지 못했습니다. 누구든지 이것을 더 잘 설명하고 사용해야 할 때 (얼마나 많은 유형의 거래 후)?
예를 들어 각 업데이트 후에 왜 GO가 필요한가요?
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
답변
GO
제대로 TSQL 명령 이 아닙니다 .
대신 SQL 서버에 연결 하는 특정 클라이언트 프로그램에 대한 명령입니다 (Sybase 또는 Microsoft-Oracle의 기능에 대해 잘 모름). “go”까지 필요할 때까지 입력 된 명령 세트를 클라이언트 프로그램에 알립니다. 실행할 서버로 전송됩니다.
왜 / 언제 필요합니까?
-
MS SQL 서버의 GO에는 “count”매개 변수가 있으므로 “repeat N times”단축키로 사용할 수 있습니다.
-
매우 큰 업데이트는 SQL 서버의 로그를 채울 수 있습니다. 이를 피하기 위해을 통해 더 작은 배치로 분리해야 할 수도 있습니다
go
.예를 들어, 국가 코드 세트에 대한 업데이트에 로그 공간이 부족한 볼륨이있는 경우 해결책은 각 국가 코드를 별도의 트랜잭션으로 분리하는 것입니다
go
.이 코드 는 클라이언트에서로 분리하여 수행 할 수 있습니다 . -
일부 SQL 문은 다음 명령문과 GO로 구분해야 작동합니다.
예를 들어, 적어도 Sybase (프로 시저 / 트리거 작성을위한 ditto)에서 단일 트랜잭션에서 테이블을 삭제하고 동일한 이름의 테이블을 다시 작성할 수 없습니다.
> drop table tempdb.guest.x1 > create table tempdb.guest.x1 (a int) > go Msg 2714, Level 16, State 1 Server 'SYBDEV', Line 2 There is already an object named 'x1' in the database. > drop table tempdb.guest.x1 > go > create table tempdb.guest.x1 (a int) > go >
답변
GO
명령문이 아니라 배치 구분 기호입니다.
구분 된 블록 GO
은 처리를 위해 클라이언트에서 서버로 전송되며 클라이언트는 결과를 기다립니다.
예를 들어
DELETE FROM a
DELETE FROM b
DELETE FROM c
, 이것은 단일 행 3
쿼리 로 서버에 전송됩니다 .
당신이 쓰는 경우
DELETE FROM a
GO
DELETE FROM b
GO
DELETE FROM c
이는 3
한 줄 쿼리 로 서버에 전송됩니다 .
GO
자체는 서버로 이동하지 않습니다. 순수한 클라이언트 측 예약어이며 다음에 의해서만 인식됩니다.SSMS
하고 osql
.
사용자 정의 조회 도구를 사용하여 연결을 통해 보내면 서버는이를 인식하지 못하고 오류를 발행합니다.
답변
많은 명령은 자체 배치에 있어야합니다. CREATE PROCEDURE
또는 테이블에 열을 추가하면 자체 배치에 있어야합니다. 동일한 배치에서 새 열을 SELECT하려고하면 구문 분석 / 컴파일시 열이 없으므로 실패합니다.
GO는 SQL 도구에서 하나의 스크립트에서이를 해결하는 데 사용됩니다. SQL 키워드가 아니며 엔진에서 인식하지 못합니다.
다음은 배치를 매일 사용하는 구체적인 예입니다.
편집 : 귀하의 예에서는 GO가 필요하지 않습니다 …
예 2를 편집하십시오. 하나의 배치에서 삭제, 작성 및 권한 부여를 할 수 없습니다. 적어도 저장 프로 시저의 끝은 어디에 있습니까?
IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL
DROP PROCEDURE dbo.uspDoStuff
GO
CREATE PROCEDURE dbo.uspDoStuff
AS
SELECT Something From ATable
GO
GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne
GO
답변
때때로 동일한 명령 또는 일련의 명령을 반복해서 실행해야 할 필요가 있습니다. 테스트 데이터를 삽입하거나 업데이트하거나 성능 테스트를 위해 서버에 부하를 줄 수 있습니다. 가장 쉬운 방법은 while 루프를 설정하고 코드를 실행하는 것이지만 SQL 2005에서는이를 수행하는 훨씬 쉬운 방법이 있습니다.
테스트 테이블을 작성하고 1000 개의 레코드로로드하려고한다고 가정하십시오. 다음 명령을 실행할 수 있으며 동일한 명령을 1000 회 실행합니다.
CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)
GO
INSERT INTO dbo.TEST (ROWID) VALUES (NEWID())
GO 1000
출처 :
http://www.mssqltips.com/tip.asp?tip=1216
그 외에는 SQL 블록의 “종료”를 표시합니다 (예 : 저장 프로 시저에서). 더 이상 정의되지 않음)
답변
모든 사람들이 이미 말했듯이 “GO”는 T-SQL의 일부가 아닙니다. “GO”는 SSMS 의 배치 구분 기호 입니다. 데이터베이스에 쿼리를 제출하는 데 사용되는 클라이언트 응용 프로그램 인 . 이는 선언 된 변수 및 테이블 변수가 “GO”앞의 코드에서 그 뒤에 오는 코드로 유지되지 않음을 의미합니다.
실제로 GO는 SSMS에서 사용 하는 기본 단어입니다. 원하는 경우 옵션에서 변경할 수 있습니다. 약간의 재미를 위해 다른 사람의 시스템에서 “GO”대신 “SELECT”를 배치 구분자로 사용하도록 옵션을 변경하십시오. 잔인한 멍청이를 용서하십시오.
답변
논리 블록을 분할하는 데 사용됩니다. 코드는 sql 명령 줄로 해석되며 다음 코드 블록을 나타냅니다.
그러나 특정 번호의 재귀 진술로 사용할 수 있습니다.
시험:
exec sp_who2
go 2
GO로 일부 문장을 구분해야합니다.
use DB
create view thisViewCreationWillFail