GO est comme la fin d'un script.
Vous pouvez avoir plusieurs instructions CREATE TABLE, séparées par GO. C'est une façon d'isoler une partie du script d'une autre, mais de tout soumettre en un seul bloc.
BEGIN et END sont comme { et } en C/++/#, Java, etc.
Ils ont lié un bloc logique de code. J'ai tendance à utiliser BEGIN et END au début et à la fin d'une procédure stockée, mais ce n'est pas strictement nécessaire là-bas. Là où c'est nécessaire, c'est pour les boucles, les instructions IF, etc., où vous avez besoin de plus d'une étape...
IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
INSERT INTO Log SELECT @id, 'deleted'
DELETE my_table WHERE id = @id
END