sourcecode

SQL Server에서 시작/끝 블록 및 Go 키워드를 사용하시겠습니까?

codebag 2023. 6. 2. 20:27
반응형

SQL Server에서 시작/끝 블록 및 Go 키워드를 사용하시겠습니까?

사용 시기에 대한 지침은 무엇입니까?begin그리고.endSQL Server 록블?

또한, 정히무이가 무엇입니까?Go do 워드는키?

GO는 대본의 끝과 같습니다.

GO로 구분된 CREATE TABLE 문을 여러 개 가질 수 있습니다.이것은 스크립트의 한 부분을 다른 부분과 분리하여 하나의 블록에 모두 제출하는 방식입니다.


BEGIN과 END는 C/++/#, Java 등에서 { 및 }과 같습니다.

그들은 논리적인 코드 블록을 묶었습니다.저는 저장 프로시저의 시작과 끝에 BEGIN과 END를 사용하는 경향이 있지만, 거기서 꼭 필요한 것은 아닙니다.필요한 곳은 루프, IF 문 등입니다. 한 단계 이상이 필요한 곳은...

IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
   INSERT INTO Log SELECT @id, 'deleted'
   DELETE my_table WHERE id = @id
END

BEGIN이 필요합니다...END: 둘 이상의 문에 걸쳐 있는 블록을 만듭니다.따라서 IF 문의 한 '다리'에서 두 가지 작업을 수행하거나 WHIN 루프의 본문에서 두 가지 이상의 작업을 수행하려면 해당 문을 BEGIN...END로 묶어야 합니다.

GO 키워드는 SQL의 일부가 아닙니다.Query Analyzer에서 스크립트를 독립적으로 실행되는 "배치"로 나누는 데만 사용됩니다.

GO는 SQL Server에서 키워드가 아니라 일괄 구분 기호입니다.GO는 문 배치를 종료합니다.SQLCMD와 같은 것을 사용하는 경우 특히 유용합니다.명령줄에 SQL 문을 입력한다고 가정합니다.문을 끝낼 때마다 해당 작업을 실행할 필요가 없으므로 SQL Server는 "GO"를 입력할 때까지 아무 작업도 수행하지 않습니다.

마찬가지로 배치를 시작하기 전에 일부 개체를 표시해야 하는 경우가 많습니다.예를 들어, 데이터베이스를 작성한 후 쿼리한다고 가정합니다.쓸 수 없습니다.

CREATE DATABASE foo;
USE foo;
CREATE TABLE bar;

CREATE TABLE을 수행하는 배치에 대해 foo가 존재하지 않기 때문입니다.이 작업을 수행해야 합니다.

CREATE DATABASE foo;
GO
USE foo;
CREATE TABLE bar;

BEGIN과 END는 다른 사람들로부터 좋은 답변을 받았습니다.

Gary가 지적했듯이, GO는 isql, sqlcmd, 쿼리 분석기 및 SQL Server Management 스튜디오와 같은 대부분의 마이크로소프트 제공 클라이언트 도구에서 사용되는 배치 구분자입니다.적어도 일부 도구에서는 배치 구분자를 변경할 수 있습니다.배치 구분자를 변경하는 용도를 본 적이 없습니다.)

GO를 언제 사용할지에 대한 질문에 답하기 위해서는 SQL이 언제 배치로 분리되어야 하는지 알아야 합니다.

일부 문은 배치의 첫 번째 문이어야 합니다.

select 1
create procedure #Zero as
    return 0

SQL Server 2000에서 오류는 다음과 같습니다.

Msg 111, Level 15, State 1, Line 3
'CREATE PROCEDURE' must be the first statement in a query batch.
Msg 178, Level 15, State 1, Line 4
A RETURN statement with a return value cannot be used in this context.

SQL Server 2005에서는 다음 오류가 도움이 되지 않습니다.

Msg 178, Level 15, State 1, Procedure #Zero, Line 5
A RETURN statement with a return value cannot be used in this context.

그래서, 사용합니다.GO스크립트에서 배치의 시작이 되어야 하는 문과 앞에 나오는 문을 구분합니다.

스크립트를 실행할 때 많은 오류로 인해 배치 실행이 중지되지만 클라이언트는 다음 배치를 보내기만 하면 스크립트 실행이 중지되지 않습니다.저는 이것을 테스트할 때 자주 사용합니다.스크립트를 트랜잭션 시작과 롤백으로 시작하여 중간에 모든 테스트를 수행합니다.

begin transaction
go
... test code here ...
go
rollback transaction

이렇게 하면 항상 시작 상태로 돌아갑니다. 테스트 코드에 오류가 발생하더라도 별도의 배치에 포함된 시작 및 롤백 트랜잭션 문이 여전히 발생합니다.별도의 배치에 있지 않으면 배치가 단위로 구문 분석되므로 구문 오류로 인해 트랜잭션이 시작되지 않습니다.또한 런타임 오류로 인해 롤백이 발생하지 않습니다.

또한 설치 스크립트를 수행하는 경우 한 파일에 여러 개의 배치가 있으면 한 배치의 오류로 인해 스크립트가 계속 실행되지 않으므로 혼란이 발생할 수 있습니다. (설치 전에 항상 백업하십시오.)

Dave Markel이 지적한 내용과 관련하여 SQL Server가 배치 초기에 생성된 개체를 데이터 사전에서 찾고 있기 때문에 구문 분석이 실패하는 경우가 있지만 구문 분석은 문을 실행하기 전에 수행될 수 있습니다.때로는 이것이 문제가 될 수도 있고, 때로는 그렇지 않을 수도 있습니다.좋은 예가 떠오르지 않습니다.그러나 'X가 존재하지 않음' 오류가 발생할 경우 해당 문에 의해 분명히 존재할 때 일괄 처리됩니다.

그리고 마지막 메모.트랜잭션은 배치에 걸쳐 있을 수 있습니다.(위 참조).변수는 배치에 걸쳐 있지 않습니다.

declare @i int
set @i = 0
go
print @i

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@i".

GO가 일괄 처리를 종료하면 코드에서 사용할 필요가 거의 없습니다.저장된 proc에서 사용할 경우 proc를 실행할 때 GO 이후 코드가 실행되지 않음을 유의하십시오.

BEGIN과 END는 여러 줄의 코드가 있는 모든 절차 유형 문을 처리하는 데 필요합니다.WHY 루프 및 커서(가능한 경우 피할 수 있음) 및 IF 문(기술적으로 코드가 한 줄만 있는 IF 문에는 필요하지 않지만 항상 IF 뒤에 입력하면 코드를 유지하는 것이 더 쉽습니다)에도 이들이 필요합니다. 사례 문은 끝을 사용하지만 시작은 없습니다.

오늘 이 문제를 해결한 후 제 의견은 다음과 같습니다. BEGIN...END 대괄호 코드는 {...}과 같습니다.C 언어로 수행합니다. 예를 들어 if...else에 대한 코드 블록 및 루프

GO는 다음 문이 이전 문에서 정의한 개체에 의존할 때 사용해야 합니다.USE 데이터베이스는 위의 좋은 예이지만 다음과 같은 경우에도 문제가 됩니다.

alter table foo add bar varchar(8);
-- if you don't put GO here then the following line will error as it doesn't know what bar is.
update foo set bar = 'bacon';
-- need a GO here to tell the interpreter to execute this statement, otherwise the Parser will lump it together with all successive statements.

문제는 이것입니다. SQL Server SQL Parser는 Oracle과 달리 첫 번째 줄에 새 기호를 정의하고 있으며 다음 줄을 참조해도 괜찮다는 것을 인식할 수 없습니다.마지막 GO 이후 이전 SQL을 실행하라는 GO 토큰을 발견할 때까지 심볼을 "확인"하지 않습니다. 이때 심볼이 데이터베이스에 적용되어 파서에 표시됩니다.

왜 세미콜론을 의미론적 단절로 취급하지 않고 개별적으로 진술을 적용하는지 모르겠습니다.제가 볼 수 있는 유일한 보너스는 GO 바로 앞에 print() 문을 놓을 수 있고 실패한 문이 있으면 인쇄가 실행되지 않는다는 것입니다.하지만 사소한 이득을 위해 많은 어려움을 겪었습니다.

언급URL : https://stackoverflow.com/questions/1180279/use-of-begin-end-blocks-and-the-go-keyword-in-sql-server

반응형