El ; no es obligatorio, pero es necesario para evitar ambegüedades. Por ejemplo- la palabra With puede estar en el medio de la instrucción como un Hint, o al principio en caso de CTE.
El sistema no puede diferenciar entre ambos casos del With sin el ; que termina la instrucción anterior.
El siguiente código resulta en un error
Código SQL:
Ver originalDECLARE @I INT
SET @I=1
WITH T AS
(SELECT *
FROM sys.objects
WHERE schema_id=@I)
SELECT *
FROM T
y el siguiente no:
Código SQL:
Ver originalDECLARE @I INT;
SET @I=1;
WITH T AS
(SELECT *
FROM sys.objects
WHERE schema_id=@I)
SELECT *
FROM T;
Por lo tanto es recomendable acostumbrar a utilizar siempre el ;.
El Go termina el Batch (y no la instrucción como el ;).