IR
Go é um separador de lote. Isso significa que tudo naquele lote é local para aquele lote específico.
Quaisquer declarações de variáveis, variáveis de tabela, etc, não passam por GOinstruções.
As tabelas #Temp são locais para uma conexão, portanto, abrangem as instruções GO.
Ponto e vírgula
Um ponto-e-vírgula é um terminador de instrução. Isso é usado exclusivamente para identificar que uma instrução específica terminou.
Na maioria dos casos, a própria sintaxe da instrução é suficiente para determinar o final de uma instrução.
Os CTEs, entretanto, exigem que WITH seja a primeira instrução, portanto, você precisa de um ponto e vírgula antes de WITH.