programing

SQL Server:batching 스테이트먼트('GO' 사용)는 어떤 용도로 유효합니까?

elecom 2023. 4. 23. 10:05
반응형

SQL Server:batching 스테이트먼트('GO' 사용)는 어떤 용도로 유효합니까?

Server SQL Server에서 .GO 는 배치 구분자로 간주됩니다.

질문입니다.배치 세퍼레이터가 있는 이유는 무엇입니까?어떤 이점을 얻을 수 있으며, 왜 사용하고자 합니까?

: :SQL 코드에서 다음과 같이 사용되는 것을 자주 보았는데 왜 이것이 베스트 프랙티스로 간주되는지 알 수 없습니다. 한, 에는 '코드는 ', '코드는 없다', '코드는 같다'가 없다.GO★★★★★★★★

USE AdventureWorks2012;
GO
BEGIN TRANSACTION;
GO
IF @@TRANCOUNT = 0
BEGIN
    SELECT FirstName, MiddleName 
    FROM Person.Person WHERE LastName = 'Adams';
    ROLLBACK TRANSACTION;
    PRINT N'Rolling back the transaction two times would cause an error.';
END;
ROLLBACK TRANSACTION;
PRINT N'Rolled back the transaction.';
GO

(출처: technologyet 매뉴얼):

이 예에서는 그것은 전혀 쓸모가 없다.

단, 많은 문장이 배치에 포함되어 있어야 합니다.

를 들면, 「」등CREATE PROCEDURE.

또한 스키마를 변경한 후(예: 기존 테이블에 새 열을 추가하는 경우) 새 스키마를 사용하는 문은 다른 배치로 따로 컴파일해야 합니다.

으로는 batches반음음음음으로 를 제출하는 GO는 SQL을 입니다.EXEC

TechNet의 말처럼GOSQL의 SQL입니다.예를 들어 SQL Server Management Studio가 배치 구분자를 발견하면 지금까지의 모든 텍스트가 독립 SQL 쿼리임을 알 수 있습니다.

저희 소프트웨어에서도 비슷한 기술을 사용하고 있습니다.NAT은 모든 프로세스, 스키마 스크립트, 데이터 변환 등을 SQL 스크립트 파일에 보관합니다(소스 제어에 체크인).설치 관리자가 이러한 스크립트 파일 중 하나를 읽을 때 GO는 파서에게 "이미 읽은 SQL을 실행할 수 있습니다."라고 말합니다.

Separator와 같은 Separator의 .GO2개의 SQL 쿼리를 같은 스크립트에 함께 포함시킬 수 있으며 일반적으로 오류가 발생합니다.예를 들어, 동일한 저장 프로시저를 동일한 스크립트파일에 폐기하고 다시 작성합니다.

if exists (select * from sys.procedures where name = 'sp_test')
    drop procedure sp_test

create procedure sp_test as
begin
    select 1
end

위의 코드를 실행하면 다음 오류가 나타납니다.

Msg 156, 레벨 15, 상태 1, 프로시저 sp_test, 줄 5 키워드 begin 근처의 구문이 잘못되었습니다.

SSMS에 다음과 같은 오류가 표시됩니다.

구문이 잘못되었습니다. 'CREATE PROCEDURE'는 배치에서 유일한 문이어야 합니다.

배치 구분 기호를 사용하면 이 오류를 방지할 수 있습니다.

if exists (select * from sys.procedures where name = 'sp_test')
    drop procedure sp_test
GO
create procedure sp_test as
begin
    select 1
end

예를 들어 저장 프로시저 또는 함수를 유지하기 위해 단일 SQL 스크립트를 소스 제어에 사용하는 경우 매우 편리합니다.우리는 이 패턴을 자주 사용합니다.

다른 흥미로운 방법으로 쿼리를 여러 번 실행할 수 있습니다.

INSERT INTO MyTable (...) ...
GO 10 -- run all the above 10 times!

SO 질문에 대한 답변에서 알 수 있듯이 원하는 대로 구성할 수도 있습니다.동료들을 괴롭히고 싶다면 배치 구분자를 "GO"가 아닌 "WHERE"와 같은 것으로 설정하십시오.재밌다! : )

배치 세퍼레이터가 있는 이유는 무엇입니까?

많은 답을 읽고 댓글에 기고해 본 저의 생각은 이렇습니다.

진짜 질문은 "배치가 왜 필요합니까?"입니다.

에는 어느 정도 또, 「2」, 「2」의 추가 .go을 사용하다

1. 일괄적으로 모든 스테이트먼트를 하나의 실행계획으로 정리한다.

SQL 개발자로서 이것이 어떤 영향을 미치는지 모르겠습니다.저기에 있네요.따라서 동일한 배치 에 일부 문을 포함할 없습니다.예를 들어, 할 수 없습니다.ALTER하고, 열을 추가하는 select동일한 배치에 있는 해당 열 - 실행 계획을 컴파일하는 동안 선택할 열이 없기 때문입니다.

개발자에게 Server를 시키지 않고 가 스스로 할 수 합니다.go스크립트에 기술되어 있습니다.또, ODBC 접속은, Diagnostics(Diagnostics)에 의해서,go명령어를 입력합니다.에 ODBC가 되어 있는 스크립트가 .ALTERSELECT예를 들어보겠습니다.

(2) 현지에서 선언된 변수는 선언된 배치의 범위 내에서만 존재할 것

네, 이렇게요.DB 구조(테이블, 프로시저 등)를 작성 및 변경하는 스크립트를 가지고 있으며 스크립트 전체의 동작을 제어하기 위해 사용되는 변수를 스크립트 시작 부분에서 선언하고 싶습니다.를 들어, 「」( 「」, 「」)에ALTER- 1, point 1, see my point 1, my point 1) script.statement - my point 1, 위" "" config config 、 """ 、 config 、 statement statement statement statement fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall fall,1 , statement statement statement fall fall fall fall fall 회피책은 테이블을 만들고 설정 변수를 테이블 내에 유지한 후 해당 테이블에서 스크립트를 끝까지 읽고 마지막에 테이블을 드롭하는 것입니다(다른 사용자가 이 문제에 직면했을 경우에 대비).

두 번째 는 실제로 가 많은 있고 변수를 '어느 정도'를 할 수 .스크립트가 많은 작업을 수행하고 있으며 단순히 모든 로컬 변수를 클리어하고 싶을 경우,GO새 변수를 선언합니다(즉, 원하는 경우 동일한 이름을 다시 사용).

3. GO에는 배치 액션을 여러 번 반복하도록 서버에 지시하는 옵션 파라미터('카운트')가 있습니다.

은 이 용어에 것 .GO진술.나는 의 초기 또는 주요 기능이라고 믿는다.GO는 포인트 1에서 와 같이 과 더 이 있습니다.는 「1」의 「1」의 「1」의 「1」의 「1」의 「1」의 「1」의 「1」과 같이 됩니다.그렇지 않으면 키워드는 다음과 같습니다.REPEAT 10 뭘 - 뭘 반복해? without. 없없 없이.GO할 수 .따라서 '''는GO사용하면 배치를 반복할 수 있습니다.

언급

이 모든 것은, GO 관한 MS메뉴얼을 이해하려고 하고 있기 때문입니다.다른 답변의 대부분은 (여기서나 다른 질문에 대해서는) 문서의 일부를 따지고 있지만, 문서 자체는 왜 배치에 이점이 있는지 설명하지 못하고 있기 때문에 이미 잘 정리된 질문에 대한 저의 공헌을 하고 있습니다.

부록

위의 내용을 작성한 후 Microsoft가 언급한 배치 사용 규칙을 찾았습니다.GO문서를 참조해 주세요.링크된 페이지에서는 실행 계획이 여러 문장으로 구성된다는 것을 설명합니다.또한 개별 문을 새로운 실행 계획으로 다시 컴파일할 수 있다고 합니다(즉, 배치를 처리하는 동안 SQL Server에 의해 자동으로). 예를 '아까다'에 이어서 '아까다'라고 하면 .CREATE TABLE ""가 있을 이다.INSERT저 테이블로요. ★★★INSERT스테이트먼트는 이전 스테이트먼트에서 테이블이 작성된 후 다시 컴파일됩니다.

가 SQL Server에서 할 수 가 있음을 알 수 .ALTERSELECT.SELECT(위의 포인트1을 참조), ODBC(위의 포인트1을 참조)를 사용하는 경우, 이것이 정확하게 발생할 수 있습니다.

이 새로운 정보는 위의 3가지 포인트를 변경하지 않습니다.방금 드린 링크에는 추가 정보가 포함되어 있으며 "규칙"으로 끝납니다.이러한 내용은 다음과 같습니다.

  • CREATE DEFAULT, CREATE FUNCTION, CREATE Rule, CREATE SCHEMA, CREATE 트리거 및 CREATE VIEW 문은 일괄적으로 다른 문과 결합할 수 없습니다.CREATE 문은 배치를 시작해야 합니다.해당 배치에 이어지는 다른 모든 문장은 첫 번째 CREATE 문 정의의 일부로 해석됩니다.

  • 테이블을 변경한 후 동일한 배치에서 새 열을 참조할 수 없습니다.

  • EXECUTE 문이 배치의 첫 번째 문인 경우 EXECUTE 키워드는 필요하지 않습니다.EXECUTE 키워드는 EXECUTE 문이 배치의 첫 번째 문이 아닌 경우 필요합니다.

Martain이 말한 것처럼 CREATE PROCEDURE와 같은 문장은 배치 내에서 유일한 문이어야 합니다.

예를 들어 저장 프로시저를 생성하고 특정 사용자에게 권한을 추가할 때마다 배치 구분 기호를 사용합니다.'Go'를 생략하면 실행 시마다 권한을 부여하는 저장 프로시저가 생깁니다.이렇게 하면 동시에 쓸 수 있고, 호출할 때 끊기는 저장 프로시저를 쓸 수 없습니다.예를들면

create procedure [procedurename]
(parameters)
as begin

select prefname, lastname from people

end

go

grant execute on [procedurename] to [username]

언급URL : https://stackoverflow.com/questions/20711326/sql-server-what-are-batching-statements-i-e-using-go-good-for

반응형